mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 05:17:35 +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,19 +80,22 @@ 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
|
||||
{
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue