[lld] [ELF] -r --compress-debug-sections: update addends for .debug_* sections relocated by REL (PR #66804)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 19 12:07:37 PDT 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld
<details>
<summary>Changes</summary>
https://reviews.llvm.org/D48929 updated addends for non-SHF_ALLOC sections
relocated by REL, but the patch did not handle the addends when
--compress-debug-sections={zlib,zstd} is used.
https://reviews.llvm.org/D116946 handled tombstone values in debug
sections in relocatable links. As a side effect, both
relocateNonAllocForRelocatable (using `sec->relocations`) and
relocatenonNonAlloc (using raw REL/RELA) may run.
Actually, we can now update addends in relocatenonAlloc, eliminating
relocateNonAllocForRelocatable. This patch implements this idea and fixes #<!-- -->66738:
Adjust `if (config->relocatable && type != target.noneRel)` in `copyRelocations`
(commit 08d6a3f1337238a480225d4caf71b8fec10dc8c6, modified by https://reviews.llvm.org/D62052)
to restrict to SHF_ALLOC sections.
---
Full diff: https://github.com/llvm/llvm-project/pull/66804.diff
2 Files Affected:
- (modified) lld/ELF/InputSection.cpp (+7-22)
- (modified) lld/test/ELF/relocatable-section-symbol.s (+5-7)
``````````diff
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index f97ca96bf4a852e..cfd9cba77a4ad96 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -463,7 +463,10 @@ void InputSection::copyRelocations(uint8_t *buf,
if (RelTy::IsRela)
p->r_addend = sym.getVA(addend) - section->getOutputSection()->addr;
- else if (config->relocatable && type != target.noneRel)
+ // See the comment in writeSections. For SHF_ALLOC sections relocated by
+ // REL relocations, utilize the non-REL/RELA loop.
+ else if (config->relocatable && (sec->flags & SHF_ALLOC) &&
+ type != target.noneRel)
sec->addReloc({R_ABS, type, rel.offset, addend, &sym});
} else if (config->emachine == EM_PPC && type == R_PPC_PLTREL24 &&
p->r_addend >= 0x8000 && sec->file->ppc32Got2) {
@@ -954,8 +957,9 @@ void InputSection::relocateNonAlloc(uint8_t *buf, ArrayRef<RelTy> rels) {
}
}
- // For a relocatable link, only tombstone values are applied.
- if (config->relocatable)
+ // For a relocatable link, only tombstone values are applied when relocated
+ // by REL relocations.
+ if (RelTy::IsRela && config->relocatable)
continue;
if (expr == R_SIZE) {
@@ -994,23 +998,6 @@ void InputSection::relocateNonAlloc(uint8_t *buf, ArrayRef<RelTy> rels) {
}
}
-// This is used when '-r' is given.
-// For REL targets, InputSection::copyRelocations() may store artificial
-// relocations aimed to update addends. They are handled in relocateAlloc()
-// for allocatable sections, and this function does the same for
-// non-allocatable sections, such as sections with debug information.
-static void relocateNonAllocForRelocatable(InputSection *sec, uint8_t *buf) {
- const unsigned bits = config->is64 ? 64 : 32;
-
- for (const Relocation &rel : sec->relocs()) {
- // InputSection::copyRelocations() adds only R_ABS relocations.
- assert(rel.expr == R_ABS);
- uint8_t *bufLoc = buf + rel.offset;
- uint64_t targetVA = SignExtend64(rel.sym->getVA(rel.addend), bits);
- target->relocate(bufLoc, rel, targetVA);
- }
-}
-
template <class ELFT>
void InputSectionBase::relocate(uint8_t *buf, uint8_t *bufEnd) {
if ((flags & SHF_EXECINSTR) && LLVM_UNLIKELY(getFile<ELFT>()->splitStack))
@@ -1022,8 +1009,6 @@ void InputSectionBase::relocate(uint8_t *buf, uint8_t *bufEnd) {
}
auto *sec = cast<InputSection>(this);
- if (config->relocatable)
- relocateNonAllocForRelocatable(sec, buf);
// For a relocatable link, also call relocateNonAlloc() to rewrite applicable
// locations with tombstone values.
const RelsOrRelas<ELFT> rels = sec->template relsOrRelas<ELFT>();
diff --git a/lld/test/ELF/relocatable-section-symbol.s b/lld/test/ELF/relocatable-section-symbol.s
index 9d8892236304b22..2ee1e7692cf2c59 100644
--- a/lld/test/ELF/relocatable-section-symbol.s
+++ b/lld/test/ELF/relocatable-section-symbol.s
@@ -30,10 +30,11 @@
# RUN: llvm-mc -filetype=obj -triple=i686 %s -o %t1.o
# RUN: ld.lld -r -o %t1 %t1.o %t1.o
-# RUN: llvm-readelf -r -x .data -x .bar -x .debug_line %t1 | FileCheck %s --check-prefixes=REL,REL0
+# RUN: llvm-readelf -r -x .data -x .bar -x .debug_line %t1 | FileCheck %s --check-prefix=REL
+## https://github.com/llvm/llvm-project/issues/66738 Update implicit addends for -r and --compress-debug-sections
# RUN: ld.lld -r --compress-debug-sections=zlib -o %t1.zlib %t1.o %t1.o
# RUN: llvm-objcopy --decompress-debug-sections %t1.zlib %t1.zlib.de
-# RUN: llvm-readelf -r -x .data -x .bar -x .debug_line %t1.zlib.de | FileCheck %s --check-prefixes=REL,REL1
+# RUN: llvm-readelf -r -x .data -x .bar -x .debug_line %t1.zlib.de | FileCheck %s --check-prefix=REL
# REL: Offset Info Type Sym. Value Symbol's Name
# REL-NEXT: 00000000 {{.*}} R_386_32 00000000 .text
@@ -55,11 +56,8 @@
# REL-NEXT: 0x00000000 01000000 05000000 ........
# REL: Hex dump of section '.bar':
# REL-NEXT: 0x00000000 01000000 00000000 02000000 04000000 ................
-# REL0: Hex dump of section '.debug_line':
-# REL0-NEXT: 0x00000000 01000000 00000000 02000000 04000000 ................
-## FIXME: https://github.com/llvm/llvm-project/issues/66738 The implicit addends for the second input section are wrong.
-# REL1: Hex dump of section '.debug_line':
-# REL1-NEXT: 0x00000000 01000000 00000000 01000000 00000000 ................
+# REL: Hex dump of section '.debug_line':
+# REL-NEXT: 0x00000000 01000000 00000000 02000000 04000000 ................
.long 42
.data
``````````
</details>
https://github.com/llvm/llvm-project/pull/66804
More information about the llvm-commits
mailing list