From 40a5487babdd27450d125035042cdbdca5b36782 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 13 Feb 2021 13:46:20 +0100 Subject: [PATCH] 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. --- Userland/Libraries/LibELF/DynamicLinker.cpp | 7 ++++++- Userland/Libraries/LibELF/DynamicLoader.cpp | 10 ++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp index 4f2c618b2c..b6a0026315 100644 --- a/Userland/Libraries/LibELF/DynamicLinker.cpp +++ b/Userland/Libraries/LibELF/DynamicLinker.cpp @@ -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(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(); diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index f2a6f79b39..4704ba9af5 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -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