[lld] ed5dd8e - [LLD][ELF] Fix --check-dynamic-relocations for 32-bit targets

Andrew Ng via llvm-commits llvm-commits at lists.llvm.org
Wed May 3 03:20:56 PDT 2023


Author: Andrew Ng
Date: 2023-05-03T10:50:32+01:00
New Revision: ed5dd8e5f0fb6ca4af26adcb6193a9d9106eb36a

URL: https://github.com/llvm/llvm-project/commit/ed5dd8e5f0fb6ca4af26adcb6193a9d9106eb36a
DIFF: https://github.com/llvm/llvm-project/commit/ed5dd8e5f0fb6ca4af26adcb6193a9d9106eb36a.diff

LOG: [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

Added: 
    

Modified: 
    lld/ELF/SyntheticSections.cpp
    lld/test/ELF/arm-pie-relative.s

Removed: 
    


################################################################################
diff  --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index e95cca993bec6..2dc263d12f089 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 20421f2d0c8e8..0628d945063d9 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


        


More information about the llvm-commits mailing list