From da3e9f760ce2328f6dfe69663c2b17da02ece2db Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sat, 13 Mar 2010 02:38:00 +0000 Subject: [PATCH] MC/Mach-O: PCrel relocations weren't using the right base address, they are relative to the fragment address, not its offset. This was masked by the text section normally being at address 0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98420 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCAssembler.cpp | 2 +- test/MC/MachO/reloc-pcrel-offset.s | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 test/MC/MachO/reloc-pcrel-offset.s diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 88be99cffdd..29ac8684bde 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -1024,7 +1024,7 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, MCAsmFixup &Fixup, } if (IsPCRel) - Value -= DF->getOffset() + Fixup.Offset; + Value -= DF->getAddress() + Fixup.Offset; return IsResolved; } diff --git a/test/MC/MachO/reloc-pcrel-offset.s b/test/MC/MachO/reloc-pcrel-offset.s new file mode 100644 index 00000000000..46dc3a9c57d --- /dev/null +++ b/test/MC/MachO/reloc-pcrel-offset.s @@ -0,0 +1,14 @@ +// RUN: llvm-mc -n -triple i386-apple-darwin9 %s -filetype=obj -o - | macho-dump --dump-section-data | FileCheck %s + +// CHECK: # Relocation 0 +// CHECK: (('word-0', 0x1), +// CHECK: ('word-1', 0x5000002)), +// CHECK-NEXT: ]) +// CHECK: ('_section_data', '\xe8\xfb\xff\xff\xff') + + .data + .long 0 + + .text +_a: + call _a -- 2.34.1