From 4071b1bac37e806848a2e0c52c9747fc843491f5 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 18 Aug 2016 21:55:23 +0000 Subject: [PATCH] [ELF] Improve error reporting for relocations We should always include symbol name when reporting relocations error to simplify debugging of these issues. Without symbol names users have to manually investigate which of the libraries contain invalid relocations which can be cumbersome when linking multiple libraries. Differential Revision: https://reviews.llvm.org/D23690 llvm-svn: 279162 --- lld/ELF/Relocations.cpp | 16 ++++++++++++---- lld/test/ELF/aarch64-fpic-add_abs_lo12_nc.s | 2 +- lld/test/ELF/aarch64-fpic-adr_prel_lo21.s | 2 +- lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s | 2 +- lld/test/ELF/aarch64-fpic-ldst32_abs_lo12_nc.s | 2 +- lld/test/ELF/aarch64-fpic-ldst64_abs_lo12_nc.s | 2 +- lld/test/ELF/aarch64-fpic-ldst8_abs_lo12_nc.s | 2 +- lld/test/ELF/arm-target1.s | 2 +- lld/test/ELF/copy-errors.s | 4 ++-- lld/test/ELF/copy-in-shared.s | 2 +- lld/test/ELF/copy-rel-corrupted.s | 2 +- lld/test/ELF/copy-rel-pie-error.s | 4 ++-- lld/test/ELF/dynamic-reloc-in-ro.s | 2 +- lld/test/ELF/eh-frame-dyn-rel.s | 2 +- 14 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index c414b6e..dca84e1 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -374,7 +374,7 @@ template static void addCopyRelSymbol(SharedSymbol *SS) { // Copy relocation against zero-sized symbol doesn't make sense. uintX_t SymSize = SS->template getSize(); if (SymSize == 0) - fatal("cannot create a copy relocation for " + SS->getName()); + fatal("cannot create a copy relocation for symbol " + SS->getName()); uintX_t Alignment = getAlignment(SS); uintX_t Off = alignTo(Out::Bss->getSize(), Alignment); @@ -401,6 +401,12 @@ template static void addCopyRelSymbol(SharedSymbol *SS) { } template +static StringRef getLocalSymbolName(const elf::ObjectFile &File, + SymbolBody &Body) { + return File.getStringTable().data() + Body.getNameOffset(); +} + +template static RelExpr adjustExpr(const elf::ObjectFile &File, SymbolBody &Body, bool IsWrite, RelExpr Expr, uint32_t Type, const uint8_t *Data) { @@ -422,12 +428,14 @@ static RelExpr adjustExpr(const elf::ObjectFile &File, SymbolBody &Body, // only memory. We can hack around it if we are producing an executable and // the refered symbol can be preemepted to refer to the executable. if (Config->Shared || (Config->Pic && !isRelExpr(Expr))) { + StringRef Name = Body.isLocal() ? getLocalSymbolName(File, Body) + : Body.getName(); error("can't create dynamic relocation " + getRelName(Type) + - " against readonly segment"); + " against symbol " + Name); return Expr; } if (Body.getVisibility() != STV_DEFAULT) { - error("cannot preempt symbol"); + error("cannot preempt symbol " + Body.getName()); return Expr; } if (Body.isObject()) { @@ -461,7 +469,7 @@ static RelExpr adjustExpr(const elf::ObjectFile &File, SymbolBody &Body, Body.NeedsCopyOrPltAddr = true; return toPlt(Expr); } - error("symbol is missing type"); + error("symbol " + Body.getName() + " is missing type"); return Expr; } diff --git a/lld/test/ELF/aarch64-fpic-add_abs_lo12_nc.s b/lld/test/ELF/aarch64-fpic-add_abs_lo12_nc.s index 7e0b6b8..0b07ee1 100644 --- a/lld/test/ELF/aarch64-fpic-add_abs_lo12_nc.s +++ b/lld/test/ELF/aarch64-fpic-add_abs_lo12_nc.s @@ -1,7 +1,7 @@ // REQUIRES: aarch64 // RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t.o // RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_AARCH64_ADD_ABS_LO12_NC against readonly segment +// CHECK: can't create dynamic relocation R_AARCH64_ADD_ABS_LO12_NC against symbol dat add x0, x0, :lo12:dat .data diff --git a/lld/test/ELF/aarch64-fpic-adr_prel_lo21.s b/lld/test/ELF/aarch64-fpic-adr_prel_lo21.s index 501a724..f86bd9f 100644 --- a/lld/test/ELF/aarch64-fpic-adr_prel_lo21.s +++ b/lld/test/ELF/aarch64-fpic-adr_prel_lo21.s @@ -1,7 +1,7 @@ // REQUIRES: aarch64 // RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t.o // RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_AARCH64_ADR_PREL_LO21 against readonly segment +// CHECK: can't create dynamic relocation R_AARCH64_ADR_PREL_LO21 against symbol dat adr x0, dat .data diff --git a/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s b/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s index 572ecff..b7e70ef 100644 --- a/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s +++ b/lld/test/ELF/aarch64-fpic-adr_prel_pg_hi21.s @@ -1,7 +1,7 @@ // REQUIRES: aarch64 // RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t.o // RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_AARCH64_ADR_PREL_PG_HI21 against readonly segment +// CHECK: can't create dynamic relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol dat adrp x0, dat .data diff --git a/lld/test/ELF/aarch64-fpic-ldst32_abs_lo12_nc.s b/lld/test/ELF/aarch64-fpic-ldst32_abs_lo12_nc.s index 85772f1..140d799 100644 --- a/lld/test/ELF/aarch64-fpic-ldst32_abs_lo12_nc.s +++ b/lld/test/ELF/aarch64-fpic-ldst32_abs_lo12_nc.s @@ -1,7 +1,7 @@ // REQUIRES: aarch64 // RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t.o // RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_AARCH64_LDST32_ABS_LO12_NC against readonly segment +// CHECK: can't create dynamic relocation R_AARCH64_LDST32_ABS_LO12_NC against symbol dat ldr s4, [x0, :lo12:dat] .data diff --git a/lld/test/ELF/aarch64-fpic-ldst64_abs_lo12_nc.s b/lld/test/ELF/aarch64-fpic-ldst64_abs_lo12_nc.s index d9f7b0c9..ff5fb41 100644 --- a/lld/test/ELF/aarch64-fpic-ldst64_abs_lo12_nc.s +++ b/lld/test/ELF/aarch64-fpic-ldst64_abs_lo12_nc.s @@ -1,7 +1,7 @@ // REQUIRES: aarch64 // RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t.o // RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_AARCH64_LDST64_ABS_LO12_NC against readonly segment +// CHECK: can't create dynamic relocation R_AARCH64_LDST64_ABS_LO12_NC against symbol dat ldr x0, [x0, :lo12:dat] .data diff --git a/lld/test/ELF/aarch64-fpic-ldst8_abs_lo12_nc.s b/lld/test/ELF/aarch64-fpic-ldst8_abs_lo12_nc.s index 20e1bba..a0ea37c 100644 --- a/lld/test/ELF/aarch64-fpic-ldst8_abs_lo12_nc.s +++ b/lld/test/ELF/aarch64-fpic-ldst8_abs_lo12_nc.s @@ -1,7 +1,7 @@ // REQUIRES: aarch64 // RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t.o // RUN: not ld.lld -shared %t.o -o %t.so 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_AARCH64_LDST8_ABS_LO12_NC against readonly segment +// CHECK: can't create dynamic relocation R_AARCH64_LDST8_ABS_LO12_NC against symbol dat ldrsb x0, [x1, :lo12:dat] .data diff --git a/lld/test/ELF/arm-target1.s b/lld/test/ELF/arm-target1.s index 9982b60..09dec1c 100644 --- a/lld/test/ELF/arm-target1.s +++ b/lld/test/ELF/arm-target1.s @@ -23,4 +23,4 @@ // RELATIVE: SYMBOL TABLE: // RELATIVE: 00001004 .text 00000000 patatino -// ABS: can't create dynamic relocation R_ARM_TARGET1 against readonly segment +// ABS: can't create dynamic relocation R_ARM_TARGET1 against symbol patatino diff --git a/lld/test/ELF/copy-errors.s b/lld/test/ELF/copy-errors.s index 9d8b72d..0767172 100644 --- a/lld/test/ELF/copy-errors.s +++ b/lld/test/ELF/copy-errors.s @@ -9,7 +9,7 @@ _start: call bar -// CHECK: cannot preempt symbol +// CHECK: cannot preempt symbol bar call zed -// CHECK: symbol is missing type +// CHECK: symbol zed is missing type diff --git a/lld/test/ELF/copy-in-shared.s b/lld/test/ELF/copy-in-shared.s index 4114d95..8dde5a6 100644 --- a/lld/test/ELF/copy-in-shared.s +++ b/lld/test/ELF/copy-in-shared.s @@ -7,4 +7,4 @@ .quad foo -// CHECK: can't create dynamic relocation R_X86_64_64 against readonly segment +// CHECK: can't create dynamic relocation R_X86_64_64 against symbol foo diff --git a/lld/test/ELF/copy-rel-corrupted.s b/lld/test/ELF/copy-rel-corrupted.s index a3f72f7..774334c 100644 --- a/lld/test/ELF/copy-rel-corrupted.s +++ b/lld/test/ELF/copy-rel-corrupted.s @@ -3,7 +3,7 @@ // RUN: ld.lld %t2.o -o %t2.so -shared // RUN: not ld.lld %t.o %t2.so -o %t.exe 2>&1 | FileCheck %s -// CHECK: cannot create a copy relocation for x +// CHECK: cannot create a copy relocation for symbol x .global _start _start: diff --git a/lld/test/ELF/copy-rel-pie-error.s b/lld/test/ELF/copy-rel-pie-error.s index 1f427023..d64746b 100644 --- a/lld/test/ELF/copy-rel-pie-error.s +++ b/lld/test/ELF/copy-rel-pie-error.s @@ -3,8 +3,8 @@ // RUN: ld.lld %t2.o -o %t2.so -shared // RUN: not ld.lld %t.o %t2.so -o %t.exe -pie 2>&1 | FileCheck %s -// CHECK: can't create dynamic relocation R_X86_64_64 against readonly segment -// CHECK: can't create dynamic relocation R_X86_64_64 against readonly segment +// CHECK: can't create dynamic relocation R_X86_64_64 against symbol bar +// CHECK: can't create dynamic relocation R_X86_64_64 against symbol foo .global _start _start: diff --git a/lld/test/ELF/dynamic-reloc-in-ro.s b/lld/test/ELF/dynamic-reloc-in-ro.s index 2ef36f6..72ab49b 100644 --- a/lld/test/ELF/dynamic-reloc-in-ro.s +++ b/lld/test/ELF/dynamic-reloc-in-ro.s @@ -5,4 +5,4 @@ foo: .quad foo -// CHECK: can't create dynamic relocation R_X86_64_64 against readonly segment +// CHECK: can't create dynamic relocation R_X86_64_64 against symbol diff --git a/lld/test/ELF/eh-frame-dyn-rel.s b/lld/test/ELF/eh-frame-dyn-rel.s index 62d5695..b17cdd4 100644 --- a/lld/test/ELF/eh-frame-dyn-rel.s +++ b/lld/test/ELF/eh-frame-dyn-rel.s @@ -7,4 +7,4 @@ .cfi_personality 0x8c, foo .cfi_endproc -// CHECK: can't create dynamic relocation R_X86_64_64 against readonly segment +// CHECK: can't create dynamic relocation R_X86_64_64 against symbol foo -- 2.7.4