summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2015-10-15 16:17:30 +0000
committerHal Finkel <hfinkel@anl.gov>2015-10-15 16:17:30 +0000
commit33e17a7c73e0be2172ec5d54cc82ebaceed5f0c5 (patch)
treebcfc28d0de111458671032e372957502c8ef6b27
parent000561c2f5cc985299952d21c44810d057468f98 (diff)
downloadbcm5719-llvm-33e17a7c73e0be2172ec5d54cc82ebaceed5f0c5.tar.gz
bcm5719-llvm-33e17a7c73e0be2172ec5d54cc82ebaceed5f0c5.zip
[ELF2/PPC64] Error on R_PPC64_ADDR16 overflow
R_PPC64_ADDR16 is not a truncated relocation, and should error if the address cannot be represented in 16 bits. llvm-svn: 250424
-rw-r--r--lld/ELF/Target.cpp4
-rw-r--r--lld/test/elf2/ppc64-addr16-error.s7
2 files changed, 10 insertions, 1 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index 8f6350cbbd0..bea3d18ea0c 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -465,7 +465,9 @@ void PPC64TargetInfo::relocateOne(uint8_t *Buf, uint8_t *BufEnd,
switch (Type) {
case R_PPC64_ADDR16:
- write16be(L, applyPPCLo(R));
+ if (!isInt<16>(R))
+ error("Relocation R_PPC64_ADDR16 overflow");
+ write16be(L, R);
break;
case R_PPC64_ADDR16_DS:
if (!isInt<16>(R))
diff --git a/lld/test/elf2/ppc64-addr16-error.s b/lld/test/elf2/ppc64-addr16-error.s
new file mode 100644
index 00000000000..5cf4d216476
--- /dev/null
+++ b/lld/test/elf2/ppc64-addr16-error.s
@@ -0,0 +1,7 @@
+// RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t
+// RUN: not ld.lld2 -shared %t -o %t2 2>&1 | FileCheck %s
+// REQUIRES: ppc
+
+.short sym+65539
+
+// CHECK: Relocation R_PPC64_ADDR16 overflow
OpenPOWER on IntegriCloud