diff options
author | Hal Finkel <hfinkel@anl.gov> | 2015-10-15 16:17:30 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2015-10-15 16:17:30 +0000 |
commit | 33e17a7c73e0be2172ec5d54cc82ebaceed5f0c5 (patch) | |
tree | bcfc28d0de111458671032e372957502c8ef6b27 | |
parent | 000561c2f5cc985299952d21c44810d057468f98 (diff) | |
download | bcm5719-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.cpp | 4 | ||||
-rw-r--r-- | lld/test/elf2/ppc64-addr16-error.s | 7 |
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 |