diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp index 04850f0dbf..1048cd57cb 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.cpp +++ b/Userland/Libraries/LibELF/DynamicLoader.cpp @@ -80,19 +80,22 @@ DynamicLoader::DynamicLoader(const char* filename, int fd, size_t size) m_valid = validate(); } -RefPtr DynamicLoader::dynamic_object_from_image() const +const DynamicObject& DynamicLoader::dynamic_object() const { - VirtualAddress dynamic_section_address; + if (!m_cached_dynamic_object) { + VirtualAddress dynamic_section_address; - m_elf_image.for_each_program_header([&dynamic_section_address](auto program_header) { - if (program_header.type() == PT_DYNAMIC) { - dynamic_section_address = VirtualAddress(program_header.raw_data()); - } - return IterationDecision::Continue; - }); - ASSERT(!dynamic_section_address.is_null()); + m_elf_image.for_each_program_header([&dynamic_section_address](auto program_header) { + if (program_header.type() == PT_DYNAMIC) { + dynamic_section_address = VirtualAddress(program_header.raw_data()); + } + return IterationDecision::Continue; + }); + ASSERT(!dynamic_section_address.is_null()); - return ELF::DynamicObject::construct(VirtualAddress(m_elf_image.base_address()), dynamic_section_address); + m_cached_dynamic_object = ELF::DynamicObject::construct(VirtualAddress(m_elf_image.base_address()), dynamic_section_address); + } + return *m_cached_dynamic_object; } size_t DynamicLoader::calculate_tls_size() const diff --git a/Userland/Libraries/LibELF/DynamicLoader.h b/Userland/Libraries/LibELF/DynamicLoader.h index 2a940df706..69f1144296 100644 --- a/Userland/Libraries/LibELF/DynamicLoader.h +++ b/Userland/Libraries/LibELF/DynamicLoader.h @@ -106,7 +106,7 @@ private: }; static void* do_mmap(int fd, size_t size, const String& name); - RefPtr dynamic_object_from_image() const; + const DynamicObject& dynamic_object() const; explicit DynamicLoader(const char* filename, int fd, size_t file_size); @@ -153,12 +153,14 @@ private: size_t m_tls_size { 0 }; Vector m_unresolved_relocations; + + mutable RefPtr m_cached_dynamic_object; }; template void DynamicLoader::for_each_needed_library(F func) const { - dynamic_object_from_image()->for_each_needed_library(move(func)); + dynamic_object().for_each_needed_library(move(func)); } } // end namespace ELF