[PATCH] D145199: [ELF] Mention section name and offset for STT_SECTION in reportRangeError()
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 2 15:07:53 PST 2023
MaskRay created this revision.
MaskRay added reviewers: dblaikie, peter.smith.
Herald added subscribers: kbarton, arichardson, nemanjai, emaste.
Herald added a project: All.
MaskRay requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
D73518 <https://reviews.llvm.org/D73518> mentioned non-STT_SECTION symbol names. This patch extends the code to
handle STT_SECTION symbols, where we report the section name and the offset.
This change helps at least the following cases with very little code.
- Let the user know whether a out-of-range relocation is due to code or data.
- For a relocation in .debug_info, which referenced `.debug_*` section (due to DWARF32 limitation) causes the problem.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D145199
Files:
lld/ELF/Relocations.cpp
lld/test/ELF/aarch64-movw-error.s
lld/test/ELF/linkerscript/eh-frame-reloc-out-of-range.test
lld/test/ELF/ppc64-reloc-pcrel34-overflow.s
lld/test/ELF/x86-64-reloc-range.s
Index: lld/test/ELF/x86-64-reloc-range.s
===================================================================
--- lld/test/ELF/x86-64-reloc-range.s
+++ lld/test/ELF/x86-64-reloc-range.s
@@ -4,7 +4,7 @@
// RUN: ld.lld --noinhibit-exec -shared %t.o -o %t 2>&1 | FileCheck %s
// RUN: ls %t
-// CHECK: {{.*}}:(.text+0x3): relocation R_X86_64_PC32 out of range: 2147483648 is not in [-2147483648, 2147483647]
+// CHECK: {{.*}}:(.text+0x3): relocation R_X86_64_PC32 out of range: 2147483648 is not in [-2147483648, 2147483647]; references .bss+0
// CHECK-NOT: relocation
lea foo(%rip), %rax
Index: lld/test/ELF/ppc64-reloc-pcrel34-overflow.s
===================================================================
--- lld/test/ELF/ppc64-reloc-pcrel34-overflow.s
+++ lld/test/ELF/ppc64-reloc-pcrel34-overflow.s
@@ -10,7 +10,7 @@
# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s -o %t.o
# RUN: not ld.lld -T %t.script %t.o -o /dev/null 2>&1 | FileCheck %s
-# CHECK: relocation R_PPC64_PCREL34 out of range: 8589934592 is not in [-8589934592, 8589934591]
+# CHECK: relocation R_PPC64_PCREL34 out of range: 8589934592 is not in [-8589934592, 8589934591]; references .data+0
plwa 3, glob_overflow at PCREL(0), 1
# CHECK-NOT: relocation
Index: lld/test/ELF/linkerscript/eh-frame-reloc-out-of-range.test
===================================================================
--- lld/test/ELF/linkerscript/eh-frame-reloc-out-of-range.test
+++ lld/test/ELF/linkerscript/eh-frame-reloc-out-of-range.test
@@ -10,4 +10,4 @@
.text : { *(.text*) } : text
}
-# CHECK: error: {{.*}}:(.eh_frame+0x20): relocation R_X86_64_PC32 out of range: 64424443872 is not in [-2147483648, 2147483647]
+# CHECK: error: {{.*}}:(.eh_frame+0x20): relocation R_X86_64_PC32 out of range: 64424443872 is not in [-2147483648, 2147483647]; references .text+0
Index: lld/test/ELF/aarch64-movw-error.s
===================================================================
--- lld/test/ELF/aarch64-movw-error.s
+++ lld/test/ELF/aarch64-movw-error.s
@@ -22,7 +22,7 @@
# CHECK: relocation R_AARCH64_MOVW_SABS_G2 out of range: -281479271677952 is not in [-281474976710656, 281474976710655]
movn x0, #:abs_g2_s:zero-0x1000100000000
-# CHECK: relocation R_AARCH64_MOVW_PREL_G0 out of range: 65536 is not in [-65536, 65535]
+# CHECK: relocation R_AARCH64_MOVW_PREL_G0 out of range: 65536 is not in [-65536, 65535]; references .text+0
movn x0, #:prel_g0:.+0x10000
# CHECK: relocation R_AARCH64_MOVW_PREL_G1 out of range: 4294967296 is not in [-4294967296, 4294967295]
movn x0, #:prel_g1:.+0x100000000
Index: lld/ELF/Relocations.cpp
===================================================================
--- lld/ELF/Relocations.cpp
+++ lld/ELF/Relocations.cpp
@@ -99,8 +99,12 @@
int64_t min, uint64_t max) {
ErrorPlace errPlace = getErrorPlace(loc);
std::string hint;
- if (rel.sym && !rel.sym->isSection())
- hint = "; references " + lld::toString(*rel.sym);
+ if (rel.sym) {
+ if (!rel.sym->isSection())
+ hint = "; references " + lld::toString(*rel.sym);
+ else if (auto *d = dyn_cast<Defined>(rel.sym))
+ hint = ("; references " + d->section->name + "+" + Twine(d->value)).str();
+ }
if (!errPlace.srcLoc.empty())
hint += "\n>>> referenced by " + errPlace.srcLoc;
if (rel.sym && !rel.sym->isSection())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D145199.502007.patch
Type: text/x-patch
Size: 3345 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230302/7e7876a9/attachment-0001.bin>
More information about the llvm-commits
mailing list