LibELF: Unmap and close the main executable after dynamic load

We don't need to keep the whole main executable in memory after
completing the dynamic loading process. We can also close the fd.
This commit is contained in:
Andreas Kling 2021-02-13 13:46:20 +01:00
parent 5b891b0c36
commit 40a5487bab
Notes: sideshowbarker 2024-07-18 22:22:08 +09:00
2 changed files with 14 additions and 3 deletions

View file

@ -257,7 +257,9 @@ void ELF::DynamicLinker::linker_main(String&& main_program_name, int main_progra
allocate_tls();
load_elf(main_program_name);
auto main_program_lib = commit_elf(main_program_name);
// NOTE: We put this in a RefPtr instead of a NonnullRefPtr so we can release it later.
RefPtr main_program_lib = commit_elf(main_program_name);
FlatPtr entry_point = reinterpret_cast<FlatPtr>(main_program_lib->image().entry().as_ptr());
if (main_program_lib->is_dynamic())
@ -272,6 +274,9 @@ void ELF::DynamicLinker::linker_main(String&& main_program_name, int main_progra
asm("int3");
}
// Unmap the main executable and release our related resources.
main_program_lib = nullptr;
int rc = syscall(SC_msyscall, nullptr);
if (rc < 0) {
ASSERT_NOT_REACHED();

View file

@ -87,8 +87,14 @@ DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size)
DynamicLoader::~DynamicLoader()
{
munmap(m_file_data, m_file_size);
close(m_image_fd);
if (munmap(m_file_data, m_file_size) < 0) {
perror("munmap");
ASSERT_NOT_REACHED();
}
if (close(m_image_fd) < 0) {
perror("close");
ASSERT_NOT_REACHED();
}
}
const DynamicObject& DynamicLoader::dynamic_object() const