Author: Fangrui Song Date: 2024-08-10T12:15:26+02:00 New Revision: 39746ee0048e1f4891d2e2b58e7c7583df43c3bc
URL: https://github.com/llvm/llvm-project/commit/39746ee0048e1f4891d2e2b58e7c7583df43c3bc DIFF: https://github.com/llvm/llvm-project/commit/39746ee0048e1f4891d2e2b58e7c7583df43c3bc.diff LOG: [ELF] scanRelocations: support .crel.eh_frame Follow-up to #98115. For EhInputSection, RelocationScanner::scan calls sortRels, which doesn't support the CREL iterator. We should set supportsCrel to false to ensure that the initial_location fields in .eh_frame FDEs are relocated. (cherry picked from commit a821fee312d15941174827a70cb534c2f2fe1177) Added: Modified: lld/ELF/Relocations.cpp lld/test/ELF/crel.s Removed: ################################################################################ diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index e19b1e6c8efb8..707768dee6d38 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -459,7 +459,8 @@ class OffsetGetter { // InputSectionBase. class RelocationScanner { public: - template <class ELFT> void scanSection(InputSectionBase &s); + template <class ELFT> + void scanSection(InputSectionBase &s, bool isEH = false); private: InputSectionBase *sec; @@ -1617,10 +1618,11 @@ void RelocationScanner::scan(Relocs<RelTy> rels) { }); } -template <class ELFT> void RelocationScanner::scanSection(InputSectionBase &s) { +template <class ELFT> +void RelocationScanner::scanSection(InputSectionBase &s, bool isEH) { sec = &s; getter = OffsetGetter(s); - const RelsOrRelas<ELFT> rels = s.template relsOrRelas<ELFT>(); + const RelsOrRelas<ELFT> rels = s.template relsOrRelas<ELFT>(!isEH); if (rels.areRelocsCrel()) scan<ELFT>(rels.crels); else if (rels.areRelocsRel()) @@ -1658,7 +1660,7 @@ template <class ELFT> void elf::scanRelocations() { RelocationScanner scanner; for (Partition &part : partitions) { for (EhInputSection *sec : part.ehFrame->sections) - scanner.template scanSection<ELFT>(*sec); + scanner.template scanSection<ELFT>(*sec, /*isEH=*/true); if (part.armExidx && part.armExidx->isLive()) for (InputSection *sec : part.armExidx->exidxSections) if (sec->isLive()) diff --git a/lld/test/ELF/crel.s b/lld/test/ELF/crel.s index d7c87be9a5402..1de3f314fc677 100644 --- a/lld/test/ELF/crel.s +++ b/lld/test/ELF/crel.s @@ -5,6 +5,7 @@ # RUN: ld.lld -pie a.o b.o -o out # RUN: llvm-objdump -d out | FileCheck %s # RUN: llvm-readelf -Srs out | FileCheck %s --check-prefix=RELOC +# RUN: llvm-dwarfdump --eh-frame out | FileCheck %s --check-prefix=UNWIND # CHECK: <_start>: # CHECK-NEXT: callq {{.*}} <foo> @@ -18,6 +19,13 @@ # RELOC: {{0*}}[[#DATA+8]] 0000000000000008 R_X86_64_RELATIVE [[#%x,DATA+0x8000000000000000]] +# RELOC: 00000000000012f4 0 NOTYPE GLOBAL DEFAULT [[#]] _start +# RELOC-NEXT: 00000000000012fe 0 NOTYPE GLOBAL DEFAULT [[#]] foo + +## initial_location fields in FDEs are correctly relocated. +# UNWIND: 00000018 00000010 0000001c FDE cie=00000000 pc=000012f4...000012fe +# UNWIND: 0000002c 00000010 00000030 FDE cie=00000000 pc=000012fe...0000130c + # RUN: ld.lld -pie --emit-relocs a.o b.o -o out1 # RUN: llvm-objdump -dr out1 | FileCheck %s --check-prefix=CHECKE # RUN: llvm-readelf -Sr out1 | FileCheck %s --check-prefix=RELOCE _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits