[PATCH] D55360: [LLD][ELF] - Report a location for symbols from the linker script when reporting an error.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 6 02:55:36 PST 2018


grimar created this revision.
grimar added a reviewer: ruiu.
Herald added subscribers: kristof.beyls, arichardson, javed.absar, emaste.
Herald added a reviewer: espindola.

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)

Previously I suggested introducing a synthetic file that would allow avoiding having
zero files and reporting the "<internal>" location. That approach was not accepted,
this patch implements a local, straightforward, less intrusive solution.


https://reviews.llvm.org/D55360

Files:
  ELF/Relocations.cpp
  test/ELF/linkerscript/symbol-location.s


Index: test/ELF/linkerscript/symbol-location.s
===================================================================
--- test/ELF/linkerscript/symbol-location.s
+++ test/ELF/linkerscript/symbol-location.s
@@ -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
Index: ELF/Relocations.cpp
===================================================================
--- ELF/Relocations.cpp
+++ ELF/Relocations.cpp
@@ -66,6 +66,14 @@
 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 @@
 // >>>               /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>>>               ";


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55360.176944.patch
Type: text/x-patch
Size: 1889 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181206/9fc043c2/attachment.bin>


More information about the llvm-commits mailing list