[llvm] r272837 - Fix llvm-objdump when disassembling a stripped Mach-O binary with the -macho option.

Kevin Enderby via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 15 14:14:01 PDT 2016

Author: enderby
Date: Wed Jun 15 16:14:01 2016
New Revision: 272837

URL: http://llvm.org/viewvc/llvm-project?rev=272837&view=rev
Fix llvm-objdump when disassembling a stripped Mach-O binary with the -macho option.
It was printing out nothing in this case.

llvm-objdump tries to disassemble sections a symbol at a time.  In the case of a
fully stripped Mach-O executable the only symbol remaining in the (__TEXT,__text)
section is the special linker defined symbol __mh_execute_header . This
symbol is special in that while it is N_SECT symbol in the (__TEXT,__text)
its address is before the start of the (__TEXT,__text).  It’s address is the
start of the __TEXT segment which is where the mach header is statically
linked. So the code in DisassembleMachO() needs to deal with this case specially.


    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/hello.exe.stripped.macho-x86_64   (with props)

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/hello.exe.stripped.macho-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/hello.exe.stripped.macho-x86_64?rev=272837&view=auto
Binary file - no diff available.

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/hello.exe.stripped.macho-x86_64
    svn:executable = *

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/hello.exe.stripped.macho-x86_64
    svn:mime-type = application/octet-stream

Modified: llvm/trunk/test/tools/llvm-objdump/X86/macho-dis-symname.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/macho-dis-symname.test?rev=272837&r1=272836&r2=272837&view=diff
--- llvm/trunk/test/tools/llvm-objdump/X86/macho-dis-symname.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/X86/macho-dis-symname.test Wed Jun 15 16:14:01 2016
@@ -17,3 +17,9 @@
 # CHECK-NOT: __start:
 # CHECK-NOT: 0000000100000d22
 # CHECK-NOT: _main:
+# not RUN: llvm-objdump -m -d %p/Inputs/exeThread.macho-x86_64 -dis-symname _environ 2>&1 | FileCheck -check-prefix BAD-SYMAME-1 %s
+BAD-SYMAME-1: -dis-symname: _environ not in the section
+# not RUN: llvm-objdump -m -d %p/Inputs/exeThread.macho-x86_64 -dis-symname __mh_execute_header 2>&1 | FileCheck -check-prefix BAD-SYMAME-2 %s
+BAD-SYMAME-2: -dis-symname: __mh_execute_header not in any section

Added: llvm/trunk/test/tools/llvm-objdump/X86/macho-disassembly-stripped.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/macho-disassembly-stripped.test?rev=272837&view=auto
--- llvm/trunk/test/tools/llvm-objdump/X86/macho-disassembly-stripped.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/macho-disassembly-stripped.test Wed Jun 15 16:14:01 2016
@@ -0,0 +1,6 @@
+// RUN: llvm-objdump -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex %p/Inputs/hello.exe.stripped.macho-x86_64 | FileCheck %s
+CHECK: (__TEXT,__text) section
+CHECK: 0000000100000f30	pushq	%rbp
+CHECK: 0000000100000f31	movq	%rsp, %rbp
+CHECK: 0000000100000f34	subq	$0x20, %rsp

Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=272837&r1=272836&r2=272837&view=diff
--- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Wed Jun 15 16:14:01 2016
@@ -6677,7 +6677,27 @@ static void DisassembleMachO(StringRef F
       // Make sure the symbol is defined in this section.
       bool containsSym = Sections[SectIdx].containsSymbol(Symbols[SymIdx]);
-      if (!containsSym)
+      if (!containsSym) {
+        if (!DisSymName.empty() && DisSymName == SymName) {
+          outs() << "-dis-symname: " << DisSymName << " not in the section\n";
+          return;
+	}
+        continue;
+      }
+      // The __mh_execute_header is special and we need to deal with that fact
+      // this symbol is before the start of the (__TEXT,__text) section and at the
+      // address of the start of the __TEXT segment.  This is because this symbol
+      // is an N_SECT symbol in the (__TEXT,__text) but its address is before the
+      // start of the section in a standard MH_EXECUTE filetype.
+      if (!DisSymName.empty() && DisSymName == "__mh_execute_header") {
+        outs() << "-dis-symname: __mh_execute_header not in any section\n";
+        return;
+      }
+      // When this code is trying to disassemble a symbol at a time and in the case
+      // there is only the __mh_execute_header symbol left as in a stripped
+      // executable, we need to deal with this by ignoring this symbol so the whole
+      // section is disassembled and this symbol is then not displayed.
+      if (SymName == "__mh_execute_header")
       // If we are only disassembling one symbol see if this is that symbol.

More information about the llvm-commits mailing list