From 196666cf5fccba4d90241c921e9e581deaf5aa55 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 30 Jan 2014 20:45:33 +0000 Subject: Only ELF has a dynamic symbol table. Remove it from ObjectFile. COFF has only one symbol table. MachO has a LC_DYSYMTAB, but that is not a symbol table, just extra info about the one symbol table (LC_SYMTAB). IR (coming soon) also has only one table. llvm-svn: 200488 --- llvm/tools/llvm-nm/llvm-nm.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'llvm/tools/llvm-nm/llvm-nm.cpp') diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 2071aa627db..a35c34e8570 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -527,12 +527,38 @@ static char getNMTypeChar(ObjectFile *Obj, symbol_iterator I) { return Res; } +static void getDynamicSymbolIterators(ObjectFile *Obj, symbol_iterator &Begin, + symbol_iterator &End) { + if (ELF32LEObjectFile *ELF = dyn_cast(Obj)) { + Begin = ELF->begin_dynamic_symbols(); + End = ELF->end_dynamic_symbols(); + return; + } + if (ELF64LEObjectFile *ELF = dyn_cast(Obj)) { + Begin = ELF->begin_dynamic_symbols(); + End = ELF->end_dynamic_symbols(); + return; + } + if (ELF32BEObjectFile *ELF = dyn_cast(Obj)) { + Begin = ELF->begin_dynamic_symbols(); + End = ELF->end_dynamic_symbols(); + return; + } + ELF64BEObjectFile *ELF = cast(Obj); + Begin = ELF->begin_dynamic_symbols(); + End = ELF->end_dynamic_symbols(); + return; +} + static void dumpSymbolNamesFromObject(ObjectFile *Obj) { symbol_iterator IBegin = Obj->begin_symbols(); symbol_iterator IEnd = Obj->end_symbols(); if (DynamicSyms) { - IBegin = Obj->begin_dynamic_symbols(); - IEnd = Obj->end_dynamic_symbols(); + if (!Obj->isELF()) { + error("File format has no dynamic symbol table", Obj->getFileName()); + return; + } + getDynamicSymbolIterators(Obj, IBegin, IEnd); } for (symbol_iterator I = IBegin; I != IEnd; ++I) { uint32_t SymFlags; -- cgit v1.2.3