summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2024-04-24 14:11:57 -0400
committerJosh Ferrell <josh@vector35.com>2024-04-24 14:11:57 -0400
commitb91f466835221bdee911fdf0479ae7995c3affe3 (patch)
tree05150a11427e10dc27572c3b7d3ae314c7bcd17f
parentfd4f45273ace0a0bf45c087c01f0b3b498bce71f (diff)
Define symtab in elf raw view
-rw-r--r--view/elf/elfview.cpp25
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"