mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 00:57:43 +00:00
LibELF+LibC: Split ELFDynamicObject into a Loader + Object
Separate some responsibilities: ELFDynamicLoader is responsible for loading elf binaries from disk and performing relocations, calling init functions, and eventually calling finalizer functions. ELFDynamicObject is a helper class to parse the .dynamic section of an elf binary, or the table of Elf32_Dyn entries at the _DYNAMIC symbol. ELFDynamicObject now owns the helper classes for Relocations, Symbols, Sections and the like that ELFDynamicLoader will use to perform relocations and symbol lookup. Because these new helpers are constructed from offsets into the .dynamic section within the loaded .data section of the binary, we don't need the ELFImage for nearly as much of the loading processes as we did before. Therefore we can remove most of the extra DynamicXXX classes and just keep the one that lets us find the location of _DYNAMIC in the new ELF. And finally, since we changed the name of the class that dlopen/dlsym care about, we need to compile/link and use the new ELFDynamicLoader class in LibC.
This commit is contained in:
parent
85b95f472d
commit
767f4c7421
8 changed files with 788 additions and 634 deletions
|
@ -43,11 +43,6 @@ unsigned ELFImage::symbol_count() const
|
|||
return section(m_symbol_table_section_index).entry_count();
|
||||
}
|
||||
|
||||
unsigned ELFImage::dynamic_symbol_count() const
|
||||
{
|
||||
return section(m_dynamic_symbol_table_section_index).entry_count();
|
||||
}
|
||||
|
||||
void ELFImage::dump() const
|
||||
{
|
||||
dbgprintf("ELFImage{%p} {\n", this);
|
||||
|
@ -117,24 +112,11 @@ bool ELFImage::parse()
|
|||
if (sh.sh_type == SHT_STRTAB && i != header().e_shstrndx) {
|
||||
if (StringView(".strtab") == section_header_table_string(sh.sh_name))
|
||||
m_string_table_section_index = i;
|
||||
else if (StringView(".dynstr") == section_header_table_string(sh.sh_name))
|
||||
m_dynamic_string_table_section_index = i;
|
||||
else
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
if (sh.sh_type == SHT_DYNAMIC) {
|
||||
ASSERT(!m_dynamic_section_index || m_dynamic_section_index == i);
|
||||
m_dynamic_section_index = i;
|
||||
}
|
||||
if (sh.sh_type == SHT_DYNSYM) {
|
||||
ASSERT(!m_dynamic_symbol_table_section_index || m_dynamic_symbol_table_section_index == i);
|
||||
m_dynamic_symbol_table_section_index = i;
|
||||
}
|
||||
if (sh.sh_type == SHT_REL) {
|
||||
if (StringView(".rel.dyn") == section_header_table_string(sh.sh_name)) {
|
||||
m_dynamic_relocation_section_index = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Then create a name-to-index map.
|
||||
|
@ -162,14 +144,6 @@ const char* ELFImage::table_string(unsigned offset) const
|
|||
return raw_data(sh.sh_offset + offset);
|
||||
}
|
||||
|
||||
const char* ELFImage::dynamic_table_string(unsigned offset) const
|
||||
{
|
||||
auto& sh = section_header(m_dynamic_string_table_section_index);
|
||||
if (sh.sh_type != SHT_STRTAB)
|
||||
return nullptr;
|
||||
return raw_data(sh.sh_offset + offset);
|
||||
}
|
||||
|
||||
const char* ELFImage::raw_data(unsigned offset) const
|
||||
{
|
||||
return reinterpret_cast<const char*>(m_buffer) + offset;
|
||||
|
@ -199,13 +173,6 @@ const ELFImage::Symbol ELFImage::symbol(unsigned index) const
|
|||
return Symbol(*this, index, raw_syms[index]);
|
||||
}
|
||||
|
||||
const ELFImage::DynamicSymbol ELFImage::dynamic_symbol(unsigned index) const
|
||||
{
|
||||
ASSERT(index < symbol_count());
|
||||
auto* raw_syms = reinterpret_cast<const Elf32_Sym*>(raw_data(section(m_dynamic_symbol_table_section_index).offset()));
|
||||
return DynamicSymbol(*this, index, raw_syms[index]);
|
||||
}
|
||||
|
||||
const ELFImage::Section ELFImage::section(unsigned index) const
|
||||
{
|
||||
ASSERT(index < section_count());
|
||||
|
@ -225,13 +192,6 @@ const ELFImage::Relocation ELFImage::RelocationSection::relocation(unsigned inde
|
|||
return Relocation(m_image, rels[index]);
|
||||
}
|
||||
|
||||
const ELFImage::DynamicRelocation ELFImage::DynamicRelocationSection::relocation(unsigned index) const
|
||||
{
|
||||
ASSERT(index < relocation_count());
|
||||
auto* rels = reinterpret_cast<const Elf32_Rel*>(m_image.raw_data(offset()));
|
||||
return DynamicRelocation(m_image, rels[index]);
|
||||
}
|
||||
|
||||
const ELFImage::RelocationSection ELFImage::Section::relocations() const
|
||||
{
|
||||
// FIXME: This is ugly.
|
||||
|
@ -263,9 +223,3 @@ const ELFImage::DynamicSection ELFImage::dynamic_section() const
|
|||
ASSERT(is_dynamic());
|
||||
return section(m_dynamic_section_index);
|
||||
}
|
||||
|
||||
const ELFImage::DynamicRelocationSection ELFImage::dynamic_relocation_section() const
|
||||
{
|
||||
ASSERT(is_dynamic());
|
||||
return section(m_dynamic_relocation_section_index);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue