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:
parent
5b891b0c36
commit
40a5487bab
Notes:
sideshowbarker
2024-07-18 22:22:08 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/40a5487babd
2 changed files with 14 additions and 3 deletions
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue