diff options
| author | Josh Ferrell <josh@vector35.com> | 2024-04-24 14:11:57 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2024-04-24 14:11:57 -0400 |
| commit | b91f466835221bdee911fdf0479ae7995c3affe3 (patch) | |
| tree | 05150a11427e10dc27572c3b7d3ae314c7bcd17f /view | |
| parent | fd4f45273ace0a0bf45c087c01f0b3b498bce71f (diff) | |
Define symtab in elf raw view
Diffstat (limited to 'view')
| -rw-r--r-- | view/elf/elfview.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/view/elf/elfview.cpp b/view/elf/elfview.cpp index 96f741b0..5d1b5cf2 100644 --- a/view/elf/elfview.cpp +++ b/view/elf/elfview.cpp @@ -2170,8 +2170,7 @@ bool ElfView::Init() DefineAutoSymbol(new Symbol(DataSymbol, "__elf_dynamic_table", adjustedVirtualAddr, NoBinding)); } - // Add types for the dynamic symbol table - if (m_auxSymbolTable.size) + if (m_auxSymbolTable.size || m_symbolTableSection.offset) { StructureBuilder symTableBuilder; if (m_elf32) @@ -2196,9 +2195,25 @@ bool ElfView::Init() Ref<Type> symTableType = Type::StructureType(symTableStruct); QualifiedName symTableName = m_elf32 ? string("Elf32_Sym") : string("Elf64_Sym"); const string symTableTypeId = Type::GenerateAutoTypeId("elf", symTableName); - QualifiedName symTableTypeName = DefineType(symTableTypeId, symTableName, symTableType); - DefineDataVariable(m_auxSymbolTable.offset, Type::ArrayType(Type::NamedType(this, symTableTypeName), m_auxSymbolTable.size / m_auxSymbolTableEntrySize)); - DefineAutoSymbol(new Symbol(DataSymbol, "__elf_symbol_table", m_auxSymbolTable.offset, NoBinding)); + + // Add types for the dynamic symbol table + if (m_auxSymbolTable.size) + { + auto defineAuxSymTableForView = [&](Ref<BinaryView> view) { + QualifiedName symTableTypeName = view->DefineType(symTableTypeId, symTableName, symTableType); + view->DefineDataVariable(m_auxSymbolTable.offset, Type::ArrayType(Type::NamedType(this, symTableTypeName), m_auxSymbolTable.size / m_auxSymbolTableEntrySize)); + view->DefineAutoSymbol(new Symbol(DataSymbol, "__elf_symbol_table", m_auxSymbolTable.offset, NoBinding)); + }; + defineAuxSymTableForView(this); + defineAuxSymTableForView(GetParentView()); + } + + if (m_symbolTableSection.offset) + { + QualifiedName symTableTypeName = GetParentView()->DefineType(symTableTypeId, symTableName, symTableType); + GetParentView()->DefineDataVariable(m_symbolTableSection.offset, Type::ArrayType(Type::NamedType(this, symTableTypeName), m_symbolTableSection.size / m_auxSymbolTableEntrySize)); + GetParentView()->DefineAutoSymbol(new Symbol(DataSymbol, "__elf_symbol_table", m_symbolTableSection.offset, NoBinding)); + } } // In 32-bit mips with .got, add .extern symbol "RTL_Resolve" |
