1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 03:27:45 +00:00

LibELF: Cache the DynamicObject in DynamicLoader

This avoids reparsing the same dynamic library file multiple times.
This commit is contained in:
Andreas Kling 2021-01-25 13:16:39 +01:00
parent 41d8734288
commit adcc1c1eff
2 changed files with 17 additions and 12 deletions

View file

@ -80,19 +80,22 @@ DynamicLoader::DynamicLoader(const char* filename, int fd, size_t size)
m_valid = validate(); m_valid = validate();
} }
RefPtr<DynamicObject> 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) { m_elf_image.for_each_program_header([&dynamic_section_address](auto program_header) {
if (program_header.type() == PT_DYNAMIC) { if (program_header.type() == PT_DYNAMIC) {
dynamic_section_address = VirtualAddress(program_header.raw_data()); dynamic_section_address = VirtualAddress(program_header.raw_data());
} }
return IterationDecision::Continue; return IterationDecision::Continue;
}); });
ASSERT(!dynamic_section_address.is_null()); 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 size_t DynamicLoader::calculate_tls_size() const

View file

@ -106,7 +106,7 @@ private:
}; };
static void* do_mmap(int fd, size_t size, const String& name); static void* do_mmap(int fd, size_t size, const String& name);
RefPtr<DynamicObject> dynamic_object_from_image() const; const DynamicObject& dynamic_object() const;
explicit DynamicLoader(const char* filename, int fd, size_t file_size); explicit DynamicLoader(const char* filename, int fd, size_t file_size);
@ -153,12 +153,14 @@ private:
size_t m_tls_size { 0 }; size_t m_tls_size { 0 };
Vector<DynamicObject::Relocation> m_unresolved_relocations; Vector<DynamicObject::Relocation> m_unresolved_relocations;
mutable RefPtr<DynamicObject> m_cached_dynamic_object;
}; };
template<typename F> template<typename F>
void DynamicLoader::for_each_needed_library(F func) const 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 } // end namespace ELF