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