[PATCH] D149347: [LLD][ELF] Fix --check-dynamic-relocations for 32-bit targets
Andrew Ng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 27 07:41:49 PDT 2023
andrewng created this revision.
andrewng added reviewers: MaskRay, arichardson.
Herald added a subscriber: emaste.
Herald added a project: All.
andrewng requested review of this revision.
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.
https://reviews.llvm.org/D149347
Files:
lld/ELF/SyntheticSections.cpp
lld/test/ELF/arm-pie-relative.s
Index: lld/test/ELF/arm-pie-relative.s
===================================================================
--- lld/test/ELF/arm-pie-relative.s
+++ lld/test/ELF/arm-pie-relative.s
@@ -3,6 +3,7 @@
// 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 /dev/null
// Test that a R_ARM_GOT_BREL relocation with PIE results in a R_ARM_RELATIVE
// dynamic relocation
Index: lld/ELF/SyntheticSections.cpp
===================================================================
--- lld/ELF/SyntheticSections.cpp
+++ lld/ELF/SyntheticSections.cpp
@@ -1564,9 +1564,11 @@
assert(sym != nullptr);
return addend;
case AddendOnlyWithTargetVA:
- case AgainstSymbolWithTargetVA:
- return InputSection::getRelocTargetVA(inputSec->file, type, addend,
- getOffset(), *sym, expr);
+ case AgainstSymbolWithTargetVA: {
+ int64_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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149347.517551.patch
Type: text/x-patch
Size: 1348 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230427/d5ca95fd/attachment.bin>
More information about the llvm-commits
mailing list