Object: Fix Mach-O relocation printing.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 14 May 2013 22:41:29 +0000 (22:41 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 14 May 2013 22:41:29 +0000 (22:41 +0000)
There were two problems that made llvm-objdump -r crash:
- for non-scattered relocations, the symbol/section index is actually in the
  (aptly named) symbolnum field.
- sections are 1-indexed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181843 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/MachOObjectFile.cpp
test/Object/X86/objdump-disassembly-inline-relocations.test

index af14c72145919853b46e8e78ee09def6a4bcebfe..654af081f9e15ae3e368b9c908d8d261b885aa57 100644 (file)
@@ -339,7 +339,7 @@ static void printRelocationTargetName(const MachOObjectFile *O,
 
   StringRef S;
   bool isExtern = O->getPlainRelocationExternal(RE);
-  uint64_t Val = O->getAnyRelocationAddress(RE);
+  uint64_t Val = O->getPlainRelocationSymbolNum(RE);
 
   if (isExtern) {
     symbol_iterator SI = O->begin_symbols();
@@ -347,7 +347,8 @@ static void printRelocationTargetName(const MachOObjectFile *O,
     SI->getName(S);
   } else {
     section_iterator SI = O->begin_sections();
-    advanceTo(SI, Val);
+    // Adjust for the fact that sections are 1-indexed.
+    advanceTo(SI, Val - 1);
     SI->getName(S);
   }
 
index a5875f6a2f960073b8b379a96b19fdeb2916da93..2ef1a435d7d4791fa33f149be74ed60f593a5d86 100644 (file)
@@ -2,6 +2,10 @@ RUN: llvm-objdump -d -r %p/../Inputs/trivial-object-test.coff-i386 \
 RUN:              | FileCheck %s -check-prefix COFF-i386
 RUN: llvm-objdump -d -r %p/../Inputs/trivial-object-test.coff-x86-64 \
 RUN:              | FileCheck %s -check-prefix COFF-x86-64
+RUN: llvm-objdump -d -r %p/../Inputs/trivial-object-test.macho-i386 \
+RUN:              | FileCheck %s -check-prefix MACHO-i386
+RUN: llvm-objdump -d -r %p/../Inputs/trivial-object-test.macho-x86-64 \
+RUN:              | FileCheck %s -check-prefix MACHO-x86-64
 
 COFF-i386: file format COFF-i386
 COFF-i386: Disassembly of section .text:
@@ -30,3 +34,34 @@ COFF-x86-64:                              19: IMAGE_REL_AMD64_REL32 SomeOtherFun
 COFF-x86-64:       1d:       8b 44 24 24                                     movl    36(%rsp), %eax
 COFF-x86-64:       21:       48 83 c4 28                                     addq    $40, %rsp
 COFF-x86-64:       25:       c3                                              ret
+
+MACHO-i386: file format Mach-O 32-bit i386
+MACHO-i386: Disassembly of section __TEXT,__text:
+MACHO-i386: _main:
+MACHO-i386:        0:       83 ec 0c                                        subl    $12, %esp
+MACHO-i386:        3:       c7 44 24 08 00 00 00 00                         movl    $0, 8(%esp)
+MACHO-i386:        b:       c7 04 24 24 00 00 00                            movl    $36, (%esp)
+MACHO-i386:                                e: GENERIC_RELOC_VANILLA __cstring
+MACHO-i386:       12:       e8 1f 00 00 00                                  calll   31
+MACHO-i386:                               13: GENERIC_RELOC_VANILLA __jump_table
+MACHO-i386:       17:       e8 15 00 00 00                                  calll   21
+MACHO-i386:                               18: GENERIC_RELOC_VANILLA __jump_table
+MACHO-i386:       1c:       8b 44 24 08                                     movl    8(%esp), %eax
+MACHO-i386:       20:       83 c4 0c                                        addl    $12, %esp
+MACHO-i386:       23:       c3                                              ret
+
+MACHO-x86-64: file format Mach-O 64-bit x86-64
+MACHO-x86-64: Disassembly of section __TEXT,__text:
+MACHO-x86-64: _main:
+MACHO-x86-64:        0:       48 83 ec 08                                     subq    $8, %rsp
+MACHO-x86-64:        4:       c7 44 24 04 00 00 00 00                         movl    $0, 4(%rsp)
+MACHO-x86-64:        c:       48 8d 3d 00 00 00 00                            leaq    (%rip), %rdi
+MACHO-x86-64:                                f: X86_64_RELOC_SIGNED   L_.str
+MACHO-x86-64:       13:       e8 00 00 00 00                                  callq   0
+MACHO-x86-64:                               14: X86_64_RELOC_BRANCH   _puts
+MACHO-x86-64:       18:       30 c0                                           xorb    %al, %al
+MACHO-x86-64:       1a:       e8 00 00 00 00                                  callq   0
+MACHO-x86-64:                               1b: X86_64_RELOC_BRANCH   _SomeOtherFunction
+MACHO-x86-64:       1f:       8b 44 24 04                                     movl    4(%rsp), %eax
+MACHO-x86-64:       23:       48 83 c4 08                                     addq    $8, %rsp
+MACHO-x86-64:       27:       c3                                              ret