diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 60 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 19 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.h | 2 |
3 files changed, 79 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 3b97d6f7f95..bfff4456b01 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -1783,3 +1783,63 @@ void llvm::printMachOFileHeader(const object::ObjectFile *Obj) { getAndPrintMachHeader(file, ncmds, filetype, cputype, true); PrintLoadCommands(file, ncmds, filetype, cputype, true); } + +//===----------------------------------------------------------------------===// +// export trie dumping +//===----------------------------------------------------------------------===// + +void llvm::printMachOExportsTrie(const object::MachOObjectFile *Obj) { + for (const llvm::object::ExportEntry &entry : Obj->exports()) { + uint64_t Flags = entry.flags(); + bool ReExport = (Flags & MachO::EXPORT_SYMBOL_FLAGS_REEXPORT); + bool WeakDef = (Flags & MachO::EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION); + bool ThreadLocal = ((Flags & MachO::EXPORT_SYMBOL_FLAGS_KIND_MASK) == + MachO::EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL); + bool Abs = ((Flags & MachO::EXPORT_SYMBOL_FLAGS_KIND_MASK) == + MachO::EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE); + bool Resolver = (Flags & MachO::EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER); + if (ReExport) + outs() << "[re-export] "; + else + outs() + << format("0x%08llX ", entry.address()); // FIXME:add in base address + outs() << entry.name(); + if (WeakDef || ThreadLocal || Resolver || Abs) { + bool needComma = false; + printf(" ["); + if (WeakDef) { + outs() << "weak_def"; + needComma = true; + } + if (ThreadLocal) { + if (needComma) + outs() << ", "; + outs() << "per-thread"; + needComma = true; + } + if (Abs) { + if (needComma) + outs() << ", "; + outs() << "absolute"; + needComma = true; + } + if (Resolver) { + if (needComma) + outs() << ", "; + outs() << format("resolver=0x%08llX", entry.other()); + needComma = true; + } + outs() << "]"; + } + if (ReExport) { + StringRef DylibName = "unknown"; + int ordinal = entry.other() - 1; + Obj->getLibraryShortNameByIndex(ordinal, DylibName); + if (entry.otherName().empty()) + outs() << " (from " << DylibName << ")"; + else + outs() << " (" << entry.otherName() << " from " << DylibName << ")"; + } + outs() << "\n"; + } +} diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index d23bfec54ca..e8efc560dfc 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -85,6 +85,9 @@ static cl::opt<bool> SymbolTable("t", cl::desc("Display the symbol table")); static cl::opt<bool> +ExportsTrie("exports-trie", cl::desc("Display mach-o exported symbols")); + +static cl::opt<bool> MachOOpt("macho", cl::desc("Use MachO specific object file parser")); static cl::alias MachOm("m", cl::desc("Alias for --macho"), cl::aliasopt(MachOOpt)); @@ -829,6 +832,17 @@ static void PrintUnwindInfo(const ObjectFile *o) { } } +static void printExportsTrie(const ObjectFile *o) { + outs() << "Exports trie:\n"; + if (const MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o)) + printMachOExportsTrie(MachO); + else { + errs() << "This operation is only currently supported " + "for Mach-O executable files.\n"; + return; + } +} + static void printPrivateFileHeader(const ObjectFile *o) { if (o->isELF()) { printELFFileHeader(o); @@ -858,6 +872,8 @@ static void DumpObject(const ObjectFile *o) { PrintUnwindInfo(o); if (PrivateHeaders) printPrivateFileHeader(o); + if (ExportsTrie) + printExportsTrie(o); } /// @brief Dump each object file in \a a; @@ -939,7 +955,8 @@ int main(int argc, char **argv) { && !SectionContents && !SymbolTable && !UnwindInfo - && !PrivateHeaders) { + && !PrivateHeaders + && !ExportsTrie) { cl::PrintHelpMessage(); return 2; } diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 9277c22b657..c259042c39d 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -35,7 +35,7 @@ void DumpBytes(StringRef bytes); void DisassembleInputMachO(StringRef Filename); void printCOFFUnwindInfo(const object::COFFObjectFile* o); void printMachOUnwindInfo(const object::MachOObjectFile* o); - +void printMachOExportsTrie(const object::MachOObjectFile* o); void printELFFileHeader(const object::ObjectFile *o); void printCOFFFileHeader(const object::ObjectFile *o); void printMachOFileHeader(const object::ObjectFile *o); |