--- /dev/null
+RUN: llvm-objdump -macho -r %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
+
+CHECK: RELOCATION RECORDS FOR [__text]:
+CHECK: 0000000000000027 X86_64_RELOC_BRANCH _printf
+CHECK: 000000000000000b X86_64_RELOC_SIGNED L_.str
+CHECK: RELOCATION RECORDS FOR [__compact_unwind]:
+CHECK: 0000000000000000 X86_64_RELOC_UNSIGNED __text
--- /dev/null
+RUN: llvm-objdump -macho -s %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
+
+CHECK: Contents of section __text:
+CHECK: 0000 554889e5 4883ec20 488d0500 000000c7 UH..H.. H.......
+CHECK: 0010 45fc0000 0000897d f8488975 f0488955 E......}.H.u.H.U
+CHECK: 0020 e84889c7 b000e800 000000b9 00000000 .H..............
+CHECK: 0030 8945e489 c84883c4 205dc3 .E...H.. ].
+CHECK: Contents of section __cstring:
+CHECK: 003b 48656c6c 6f20776f 726c640a 00 Hello world..
+CHECK: Contents of section __compact_unwind:
+CHECK: 0048 00000000 00000000 3b000000 00000001 ........;.......
+CHECK: 0058 00000000 00000000 00000000 00000000 ................
+CHECK: Contents of section __eh_frame:
+CHECK: 0068 14000000 00000000 017a5200 01781001 .........zR..x..
+CHECK: 0078 100c0708 90010000 24000000 1c000000 ........$.......
+CHECK: 0088 78ffffff ffffffff 3b000000 00000000 x.......;.......
+CHECK: 0098 00410e10 8602430d 06000000 00000000 .A....C.........
--- /dev/null
+RUN: llvm-objdump -macho -h %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
+
+CHECK: Sections:
+CHECK: Idx Name Size Address Type
+CHECK: 0 __text 0000003b 0000000000000000 TEXT
+CHECK: 1 __cstring 0000000d 000000000000003b DATA
+CHECK: 2 __compact_unwind 00000020 0000000000000048 DATA
+CHECK: 3 __eh_frame 00000040 0000000000000068 DATA
--- /dev/null
+RUN: llvm-objdump -macho -t %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
+
+CHECK: SYMBOL TABLE:
+CHECK: 000000000000003b l F __TEXT,__cstring 0000000d L_.str
+CHECK: 0000000000000068 l F __TEXT,__eh_frame 00000018 EH_frame0
+CHECK: 0000000000000000 g F __TEXT,__text 0000003b _main
+CHECK: 0000000000000080 g F __TEXT,__eh_frame 00000028 _main.eh
+CHECK: 0000000000000000 *UND* 00000000 _printf
--- /dev/null
+RUN: llvm-objdump -macho -u %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
+
+CHECK: Contents of __compact_unwind section:
+CHECK: Entry at offset 0x0:
+CHECK: start: 0x0 _main
+CHECK: length: 0x3b
+CHECK: compact encoding: 0x01000000
if (Disassemble)
DisassembleMachO(Filename, MachOOF);
- // TODO: These should/could be printed in Darwin's otool(1) or nm(1) style
- // for -macho. Or just used a new option that maps to the otool(1)
- // option like -r, -l, etc. Or just the normal llvm-objdump option
- // but now for this slice so that the -arch options can be used.
- // if (Relocations)
- // PrintRelocations(MachOOF);
- // if (SectionHeaders)
- // PrintSectionHeaders(MachOOF);
- // if (SectionContents)
- // PrintSectionContents(MachOOF);
- // if (SymbolTable)
- // PrintSymbolTable(MachOOF);
- // if (UnwindInfo)
- // PrintUnwindInfo(MachOOF);
+ if (Relocations)
+ PrintRelocations(MachOOF);
+ if (SectionHeaders)
+ PrintSectionHeaders(MachOOF);
+ if (SectionContents)
+ PrintSectionContents(MachOOF);
+ if (SymbolTable)
+ PrintSymbolTable(MachOOF);
+ if (UnwindInfo)
+ printMachOUnwindInfo(MachOOF);
if (PrivateHeaders)
printMachOFileHeader(MachOOF);
if (ExportsTrie)
Disassembled("d", cl::desc("Alias for --disassemble"),
cl::aliasopt(Disassemble));
-static cl::opt<bool>
-Relocations("r", cl::desc("Display the relocation entries in the file"));
+cl::opt<bool>
+llvm::Relocations("r", cl::desc("Display the relocation entries in the file"));
-static cl::opt<bool>
-SectionContents("s", cl::desc("Display the content of each section"));
+cl::opt<bool>
+llvm::SectionContents("s", cl::desc("Display the content of each section"));
-static cl::opt<bool>
-SymbolTable("t", cl::desc("Display the symbol table"));
+cl::opt<bool>
+llvm::SymbolTable("t", cl::desc("Display the symbol table"));
cl::opt<bool>
llvm::ExportsTrie("exports-trie", cl::desc("Display mach-o exported symbols"));
llvm::ArchName("arch-name", cl::desc("Target arch to disassemble for, "
"see -version for available targets"));
-static cl::opt<bool>
-SectionHeaders("section-headers", cl::desc("Display summaries of the headers "
- "for each section."));
+cl::opt<bool>
+llvm::SectionHeaders("section-headers", cl::desc("Display summaries of the "
+ "headers for each section."));
static cl::alias
SectionHeadersShort("headers", cl::desc("Alias for --section-headers"),
cl::aliasopt(SectionHeaders));
"instructions, do not print "
"the instruction bytes."));
-static cl::opt<bool>
-UnwindInfo("unwind-info", cl::desc("Display unwind information"));
+cl::opt<bool>
+llvm::UnwindInfo("unwind-info", cl::desc("Display unwind information"));
static cl::alias
UnwindInfoShort("u", cl::desc("Alias for --unwind-info"),
}
}
-static void PrintRelocations(const ObjectFile *Obj) {
+void llvm::PrintRelocations(const ObjectFile *Obj) {
StringRef Fmt = Obj->getBytesInAddress() > 4 ? "%016" PRIx64 :
"%08" PRIx64;
// Regular objdump doesn't print relocations in non-relocatable object
}
}
-static void PrintSectionHeaders(const ObjectFile *Obj) {
+void llvm::PrintSectionHeaders(const ObjectFile *Obj) {
outs() << "Sections:\n"
"Idx Name Size Address Type\n";
unsigned i = 0;
}
}
-static void PrintSectionContents(const ObjectFile *Obj) {
+void llvm::PrintSectionContents(const ObjectFile *Obj) {
std::error_code EC;
for (const SectionRef &Section : Obj->sections()) {
StringRef Name;
}
}
-static void PrintSymbolTable(const ObjectFile *o) {
+void llvm::PrintSymbolTable(const ObjectFile *o) {
outs() << "SYMBOL TABLE:\n";
if (const COFFObjectFile *coff = dyn_cast<const COFFObjectFile>(o)) {
extern cl::opt<bool> WeakBind;
extern cl::opt<bool> UniversalHeaders;
extern cl::opt<bool> ArchiveHeaders;
+extern cl::opt<bool> Relocations;
+extern cl::opt<bool> SectionHeaders;
+extern cl::opt<bool> SectionContents;
+extern cl::opt<bool> SymbolTable;
+extern cl::opt<bool> UnwindInfo;
// Various helper functions.
bool error(std::error_code ec);
void printBindTable(const object::ObjectFile *o);
void printLazyBindTable(const object::ObjectFile *o);
void printWeakBindTable(const object::ObjectFile *o);
+void PrintRelocations(const object::ObjectFile *o);
+void PrintSectionHeaders(const object::ObjectFile *o);
+void PrintSectionContents(const object::ObjectFile *o);
+void PrintSymbolTable(const object::ObjectFile *o);
} // end namespace llvm