mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 03:37:43 +00:00
LibELF: Cache the DynamicObject in DynamicLoader
This avoids reparsing the same dynamic library file multiple times.
This commit is contained in:
parent
41d8734288
commit
adcc1c1eff
2 changed files with 17 additions and 12 deletions
|
@ -80,8 +80,9 @@ DynamicLoader::DynamicLoader(const char* filename, int fd, size_t size)
|
|||
m_valid = validate();
|
||||
}
|
||||
|
||||
RefPtr<DynamicObject> DynamicLoader::dynamic_object_from_image() const
|
||||
const DynamicObject& DynamicLoader::dynamic_object() const
|
||||
{
|
||||
if (!m_cached_dynamic_object) {
|
||||
VirtualAddress dynamic_section_address;
|
||||
|
||||
m_elf_image.for_each_program_header([&dynamic_section_address](auto program_header) {
|
||||
|
@ -92,7 +93,9 @@ RefPtr<DynamicObject> DynamicLoader::dynamic_object_from_image() const
|
|||
});
|
||||
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
|
||||
|
|
|
@ -106,7 +106,7 @@ private:
|
|||
};
|
||||
|
||||
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);
|
||||
|
||||
|
@ -153,12 +153,14 @@ private:
|
|||
size_t m_tls_size { 0 };
|
||||
|
||||
Vector<DynamicObject::Relocation> m_unresolved_relocations;
|
||||
|
||||
mutable RefPtr<DynamicObject> m_cached_dynamic_object;
|
||||
};
|
||||
|
||||
template<typename F>
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue