From 1ac7fe0f4dae8a9266fa6ff31ea4939ec64a3e5e Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 21 Apr 2011 18:36:50 +0000 Subject: [PATCH] Fix relative relocations. This is sufficient for running the rust testsuite with MC :-) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129923 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFObjectWriter.cpp | 7 ++++++- test/MC/COFF/diff.s | 24 +++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index fe3342c886b..101237aabb0 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -656,8 +656,13 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, const MCSymbol *B = &Target.getSymB()->getSymbol(); MCSymbolData &B_SD = Asm.getSymbolData(*B); - FixedValue = Layout.getSymbolOffset(&A_SD) - Layout.getSymbolOffset(&B_SD); + // Offset of the symbol in the section + int64_t a = Layout.getSymbolOffset(&B_SD); + // Ofeset of the relocation in the section + int64_t b = Layout.getFragmentOffset(Fragment) + Fixup.getOffset(); + + FixedValue = b - a; // In the case where we have SymbA and SymB, we just need to store the delta // between the two symbols. Update FixedValue to account for the delta, and // skip recording the relocation. diff --git a/test/MC/COFF/diff.s b/test/MC/COFF/diff.s index b7db5097fd6..aa683f26a7b 100644 --- a/test/MC/COFF/diff.s +++ b/test/MC/COFF/diff.s @@ -5,6 +5,7 @@ .type 32; .endef .text + .long 0 .globl _foobar .align 16, 0x90 _foobar: # @foobar @@ -15,13 +16,30 @@ _foobar: # @foobar .globl _rust_crate # @rust_crate .align 4 _rust_crate: + .long 0 + .long _foobar + .long _foobar-_rust_crate .long _foobar-_rust_crate - -// CHECK: Relocations = [ +// CHECK: Name = .data +// CHECK: SectionData = +// CHECK-NEXT: 00 00 00 00 00 00 00 00 - 1C 00 00 00 20 00 00 00 |............ ...| +// CHECK: Relocations = [ // CHECK-NEXT: 0 = { -// CHECK-NEXT: VirtualAddress = 0x0 +// CHECK-NEXT: VirtualAddress = 0x4 // CHECK-NEXT: SymbolTableIndex = +// CHECK-NEXT: Type = IMAGE_REL_I386_DIR32 (6) +// CHECK-NEXT: SymbolName = _foobar +// CHECK-NEXT: } +// CHECK-NEXT: 1 = { +// CHECK-NEXT: VirtualAddress = 0x8 +// CHECK-NEXT: SymbolTableIndex = 0 +// CHECK-NEXT: Type = IMAGE_REL_I386_REL32 (20) +// CHECK-NEXT: SymbolName = .text +// CHECK-NEXT: } +// CHECK-NEXT: 2 = { +// CHECK-NEXT: VirtualAddress = 0xC +// CHECK-NEXT: SymbolTableIndex = 0 // CHECK-NEXT: Type = IMAGE_REL_I386_REL32 (20) // CHECK-NEXT: SymbolName = .text // CHECK-NEXT: } -- 2.34.1