[llvm-branch-commits] [lld] 39746ee - [ELF] scanRelocations: support .crel.eh_frame
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Aug 10 03:15:38 PDT 2024
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
More information about the llvm-branch-commits
mailing list