summaryrefslogtreecommitdiff
path: root/tools/llvm-nm
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-01-30 20:45:33 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-01-30 20:45:33 +0000
commit6420c1109328813ddd6eec03c510ac7ae46249fb (patch)
treee01016bed725ad455da8f4b7fa5a981757c6ed5b /tools/llvm-nm
parent8010c98bd52166b156aa849f10779af8fd639393 (diff)
downloadllvm-6420c1109328813ddd6eec03c510ac7ae46249fb.tar.gz
llvm-6420c1109328813ddd6eec03c510ac7ae46249fb.tar.bz2
llvm-6420c1109328813ddd6eec03c510ac7ae46249fb.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200488 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-nm')
-rw-r--r--tools/llvm-nm/llvm-nm.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp
index 2071aa627d..a35c34e857 100644
--- a/tools/llvm-nm/llvm-nm.cpp
+++ b/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<ELF32LEObjectFile>(Obj)) {
+ Begin = ELF->begin_dynamic_symbols();
+ End = ELF->end_dynamic_symbols();
+ return;
+ }
+ if (ELF64LEObjectFile *ELF = dyn_cast<ELF64LEObjectFile>(Obj)) {
+ Begin = ELF->begin_dynamic_symbols();
+ End = ELF->end_dynamic_symbols();
+ return;
+ }
+ if (ELF32BEObjectFile *ELF = dyn_cast<ELF32BEObjectFile>(Obj)) {
+ Begin = ELF->begin_dynamic_symbols();
+ End = ELF->end_dynamic_symbols();
+ return;
+ }
+ ELF64BEObjectFile *ELF = cast<ELF64BEObjectFile>(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;