summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-04-18 12:58:59 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-04-18 12:58:59 +0000
commitf4c1cd4006626ebccdd2a7096bbe2b26bb91097f (patch)
tree15364daf4b11c840de38606214d1659037b95eac
parentece62b962e31815f7c3a3b49db578bc6ad265e73 (diff)
downloadbcm5719-llvm-f4c1cd4006626ebccdd2a7096bbe2b26bb91097f.tar.gz
bcm5719-llvm-f4c1cd4006626ebccdd2a7096bbe2b26bb91097f.zip
Fix handling of R_X86_64_GOT32.
It computes the offset to the end of .got. llvm-svn: 266610
-rw-r--r--lld/ELF/Target.cpp3
-rw-r--r--lld/test/ELF/relocation.s8
2 files changed, 10 insertions, 1 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index 49d07c6cb54..5d1332ebf73 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -649,7 +649,7 @@ RelExpr X86_64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
case R_X86_64_PC32:
return R_PC;
case R_X86_64_GOT32:
- return R_GOT;
+ return R_GOT_FROM_END;
case R_X86_64_GOTPCREL:
case R_X86_64_GOTTPOFF:
return R_GOT_PC;
@@ -869,6 +869,7 @@ void X86_64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
break;
case R_X86_64_32S:
case R_X86_64_TPOFF32:
+ case R_X86_64_GOT32:
checkInt<32>(Val, Type);
write32le(Loc, Val);
break;
diff --git a/lld/test/ELF/relocation.s b/lld/test/ELF/relocation.s
index aa58040e7b0..11832683d9b 100644
--- a/lld/test/ELF/relocation.s
+++ b/lld/test/ELF/relocation.s
@@ -124,3 +124,11 @@ R_X86_64_GOTPCREL:
// 7952 = 0x101f0000 in little endian
// CHECK: Contents of section .R_X86_64_GOTPCREL
// CHECK-NEXT: 101d0 201f0000
+
+.section .R_X86_64_GOT32,"a",@progbits
+.global R_X86_64_GOT32
+R_X86_64_GOT32:
+ .long zed@got
+
+// CHECK: Contents of section .R_X86_64_GOT32:
+// CHECK-NEXT: f8ffffff
OpenPOWER on IntegriCloud