diff options
author | Andrew Ng <andrew.ng@sony.com> | 2023-04-26 10:18:04 +0100 |
---|---|---|
committer | Andrew Ng <andrew.ng@sony.com> | 2023-05-03 10:50:32 +0100 |
commit | ed5dd8e5f0fb6ca4af26adcb6193a9d9106eb36a (patch) | |
tree | c97b5c5c655cff7d298015358880fd24a87e1ab6 /lld | |
parent | c68e92d941723702810093161be4834f3ca68372 (diff) | |
download | llvm-ed5dd8e5f0fb6ca4af26adcb6193a9d9106eb36a.tar.gz |
[LLD][ELF] Fix --check-dynamic-relocations for 32-bit targets
OutputSection::checkDynRelAddends() incorrectly reports an internal
linker error for large addends on 32-bit targets. This is caused by the
lack of sign extension in DynamicReloc::computeAddend() for 32-bit
addends.
Differential Revision: https://reviews.llvm.org/D149347
Diffstat (limited to 'lld')
-rw-r--r-- | lld/ELF/SyntheticSections.cpp | 8 | ||||
-rw-r--r-- | lld/test/ELF/arm-pie-relative.s | 13 |
2 files changed, 18 insertions, 3 deletions
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index e95cca993bec..2dc263d12f08 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1564,9 +1564,11 @@ int64_t DynamicReloc::computeAddend() const { assert(sym != nullptr); return addend; case AddendOnlyWithTargetVA: - case AgainstSymbolWithTargetVA: - return InputSection::getRelocTargetVA(inputSec->file, type, addend, - getOffset(), *sym, expr); + case AgainstSymbolWithTargetVA: { + uint64_t ca = InputSection::getRelocTargetVA(inputSec->file, type, addend, + getOffset(), *sym, expr); + return config->is64 ? ca : SignExtend64<32>(ca); + } case MipsMultiGotPage: assert(sym == nullptr); return getMipsPageAddr(outputSec->addr) + addend; diff --git a/lld/test/ELF/arm-pie-relative.s b/lld/test/ELF/arm-pie-relative.s index 20421f2d0c8e..0628d945063d 100644 --- a/lld/test/ELF/arm-pie-relative.s +++ b/lld/test/ELF/arm-pie-relative.s @@ -3,6 +3,10 @@ // RUN: ld.lld %t.o --pie -o %t // RUN: llvm-readobj -r %t | FileCheck %s // RUN: llvm-readelf -x .got %t | FileCheck %s --check-prefix=GOT +// RUN: ld.lld %t.o --pie --image-base=0x80000000 --check-dynamic-relocations -o %t1 2>&1 | \ +// RUN: FileCheck %s -allow-empty -check-prefix=NOERR +// RUN: llvm-readobj -r %t1 | FileCheck %s --check-prefix=CHECK1 +// RUN: llvm-readelf -x .got %t1 | FileCheck %s --check-prefix=GOT1 // Test that a R_ARM_GOT_BREL relocation with PIE results in a R_ARM_RELATIVE // dynamic relocation @@ -23,3 +27,12 @@ sym: // GOT: section '.got': // GOT-NEXT: 0x000201e4 e8010300 + +// NOERR-NOT: internal linker error + +// CHECK1: Relocations [ +// CHECK1-NEXT: Section (5) .rel.dyn { +// CHECK1-NEXT: 0x800201E4 R_ARM_RELATIVE + +// GOT1: section '.got': +// GOT1-NEXT: 0x800201e4 e8010380 |