[lld] r349612 - [LLD][ELF] - Report a location for symbols from the linker script when reporting an error.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 19 02:19:40 PST 2018


Author: grimar
Date: Wed Dec 19 02:19:40 2018
New Revision: 349612

URL: http://llvm.org/viewvc/llvm-project?rev=349612&view=rev
Log:
[LLD][ELF] - Report a location for symbols from the linker script when reporting an error.

When we report an error for symbols defined in the linker script,
we do not report the location properly.

For example:

ld.lld: error: relocation R_AARCH64_CALL26 cannot refer to absolute symbol: aliasto__text
>>> defined in <internal>
>>> referenced by rtoabs.o:(.text+0x4)

This patch fixes that.

Differential revision: https://reviews.llvm.org/D55360

Added:
    lld/trunk/test/ELF/linkerscript/symbol-location.s
Modified:
    lld/trunk/ELF/Relocations.cpp

Modified: lld/trunk/ELF/Relocations.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=349612&r1=349611&r2=349612&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Wed Dec 19 02:19:40 2018
@@ -66,6 +66,14 @@ using namespace llvm::support::endian;
 using namespace lld;
 using namespace lld::elf;
 
+static Optional<std::string> getLinkerScriptLocation(const Symbol &Sym) {
+  for (BaseCommand *Base : Script->SectionCommands)
+    if (auto *Cmd = dyn_cast<SymbolAssignment>(Base))
+      if (Cmd->Sym == &Sym)
+        return Cmd->Location;
+  return None;
+}
+
 // Construct a message in the following format.
 //
 // >>> defined in /home/alice/src/foo.o
@@ -73,8 +81,13 @@ using namespace lld::elf;
 // >>>               /home/alice/src/bar.o:(.text+0x1)
 static std::string getLocation(InputSectionBase &S, const Symbol &Sym,
                                uint64_t Off) {
-  std::string Msg =
-      "\n>>> defined in " + toString(Sym.File) + "\n>>> referenced by ";
+  std::string Msg = "\n>>> defined in ";
+  if (Sym.File)
+    Msg += toString(Sym.File);
+  else if (Optional<std::string> Loc = getLinkerScriptLocation(Sym))
+    Msg += *Loc;
+
+  Msg += "\n>>> referenced by ";
   std::string Src = S.getSrcMsg(Sym, Off);
   if (!Src.empty())
     Msg += Src + "\n>>>               ";

Added: lld/trunk/test/ELF/linkerscript/symbol-location.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbol-location.s?rev=349612&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/symbol-location.s (added)
+++ lld/trunk/test/ELF/linkerscript/symbol-location.s Wed Dec 19 02:19:40 2018
@@ -0,0 +1,15 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "foo = 1;" > %t.script
+# RUN: not ld.lld -pie -o %t --script %t.script %t.o 2>&1 | FileCheck %s
+
+## Here we check that symbol 'foo' location is reported properly.
+
+# CHECK: error: relocation R_X86_64_PLT32 cannot refer to absolute symbol: foo
+# CHECK: >>> defined in {{.*}}.script:1
+# CHECK: >>> referenced by {{.*}}.o:(.text+0x1)
+
+.text
+.globl _start
+_start:
+ call foo at PLT




More information about the llvm-commits mailing list