[lld] r358652 - [LLD][ELF] - A fix for "linker script assignment loses relative nature of section" bug.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 18 03:00:37 PDT 2019


Author: grimar
Date: Thu Apr 18 03:00:37 2019
New Revision: 358652

URL: http://llvm.org/viewvc/llvm-project?rev=358652&view=rev
Log:
[LLD][ELF] - A fix for "linker script assignment loses relative nature of section" bug.

This is https://bugs.llvm.org//show_bug.cgi?id=39857.
I added the comment with much more details to the bug page,
the short version is below.

The following script and code demonstrates the issue:

aliasto__text = __text;
 SECTIONS {
  .text 0x1000 : { __text = . ; *(.text) }
 }
...
call aliasto__text

LLD fails with "cannot refer to absolute symbol: aliasto__text" error.
It happens because at the moment of scanning the relocations
we do not yet assign the correct/final/any section value for the symbol aliasto__text.
I made a change to Relocations.cpp to fix that.

Also, I had to remove the symbol-location.s test case completely, because now it does not
trigger any error. Since now all linker scripts symbols are resolved to constants, no
errors can be triggered at all it seems. I checked that it is consistent with the behavior
of bfd and gold (they do not trigger errors for the case from symbol-location.s), so it should
be OK. I.e. at least it is probably not the best possible, but natural behavior we obtained.

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

Added:
    lld/trunk/test/ELF/linkerscript/symbol-alias-relocation.s
Removed:
    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=358652&r1=358651&r2=358652&view=diff
==============================================================================
--- lld/trunk/ELF/Relocations.cpp (original)
+++ lld/trunk/ELF/Relocations.cpp Thu Apr 18 03:00:37 2019
@@ -421,6 +421,11 @@ static bool isStaticLinkTimeConstant(Rel
   if (E == R_SIZE)
     return true;
 
+  // We set the final symbols values for linker script defined symbols later.
+  // They always can be computed as a link time constant.
+  if (Sym.ScriptDefined)
+    return true;
+
   // For the target and the relocation, we want to know if they are
   // absolute or relative.
   bool AbsVal = isAbsoluteValue(Sym);

Added: lld/trunk/test/ELF/linkerscript/symbol-alias-relocation.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbol-alias-relocation.s?rev=358652&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/symbol-alias-relocation.s (added)
+++ lld/trunk/test/ELF/linkerscript/symbol-alias-relocation.s Thu Apr 18 03:00:37 2019
@@ -0,0 +1,36 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "aliasto__text = __text; SECTIONS { .text 0x1000 : { __text = . ; *(.text) } }" > %t.script
+# RUN: ld.lld -pie -o %t --script %t.script %t.o
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+
+## Check that alias 'aliasto__text' has the correct value.
+## (It should belong to the section .text and point to it's start).
+
+# CHECK:      Symbol {
+# CHECK:        Name: __text
+# CHECK-NEXT:   Value: 0x1000
+# CHECK-NEXT:   Size: 0
+# CHECK-NEXT:   Binding: Global
+# CHECK-NEXT:   Type: None
+# CHECK-NEXT:   Other: 0
+# CHECK-NEXT:   Section: .text
+# CHECK-NEXT: }
+
+# CHECK:      Symbol {
+# CHECK:        Name: aliasto__text
+# CHECK-NEXT:   Value: 0x1000
+# CHECK-NEXT:   Size: 0
+# CHECK-NEXT:   Binding: Global
+# CHECK-NEXT:   Type: None
+# CHECK-NEXT:   Other: 0
+# CHECK-NEXT:   Section: .text
+# CHECK-NEXT: }
+
+.text
+.globl _start
+.type _start, %function
+_start:
+.globl aliasto__text
+   call __text
+   call aliasto__text

Removed: lld/trunk/test/ELF/linkerscript/symbol-location.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbol-location.s?rev=358651&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/symbol-location.s (original)
+++ lld/trunk/test/ELF/linkerscript/symbol-location.s (removed)
@@ -1,15 +0,0 @@
-# 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