[lld] r293748 - [ELF] - Linkerscript: properly mark minus expression with non-absolute flag

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 1 01:01:18 PST 2017


Author: grimar
Date: Wed Feb  1 03:01:16 2017
New Revision: 293748

URL: http://llvm.org/viewvc/llvm-project?rev=293748&view=rev
Log:
[ELF] - Linkerscript: properly mark minus expression with non-absolute flag

This is alternative to D28857 which was incorrect.

One of linux scripts contains:

vvar_start = . - 2 * (1 << 12);
vvar_page = vvar_start;
vvar_vsyscall_gtod_data = vvar_page + 128;
Previously we did not mark first expression as non-absolute,
though it contains location counter.

And LLD failed with error:
relocation R_X86_64_PC32 cannot refer to absolute symbol

This patch should fix the issue, and opens road for doing the same for other operators
(though not clear if that is needed).

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

Added:
    lld/trunk/test/ELF/linkerscript/non-absolute.s
Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=293748&r1=293747&r2=293748&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Wed Feb  1 03:01:16 2017
@@ -1612,6 +1612,12 @@ SymbolAssignment *ScriptParser::readAssi
 Expr ScriptParser::readExpr() { return readExpr1(readPrimary(), 0); }
 
 static Expr combine(StringRef Op, Expr L, Expr R) {
+  auto IsAbs = [=] { return L.IsAbsolute() && R.IsAbsolute(); };
+  auto GetOutSec = [=] {
+    const OutputSectionBase *S = L.Section();
+    return S ? S : R.Section();
+  };
+
   if (Op == "*")
     return [=](uint64_t Dot) { return L(Dot) * R(Dot); };
   if (Op == "/") {
@@ -1625,14 +1631,9 @@ static Expr combine(StringRef Op, Expr L
     };
   }
   if (Op == "+")
-    return {[=](uint64_t Dot) { return L(Dot) + R(Dot); },
-            [=] { return L.IsAbsolute() && R.IsAbsolute(); },
-            [=] {
-              const OutputSectionBase *S = L.Section();
-              return S ? S : R.Section();
-            }};
+    return {[=](uint64_t Dot) { return L(Dot) + R(Dot); }, IsAbs, GetOutSec};
   if (Op == "-")
-    return [=](uint64_t Dot) { return L(Dot) - R(Dot); };
+    return {[=](uint64_t Dot) { return L(Dot) - R(Dot); }, IsAbs, GetOutSec};
   if (Op == "<<")
     return [=](uint64_t Dot) { return L(Dot) << R(Dot); };
   if (Op == ">>")

Added: lld/trunk/test/ELF/linkerscript/non-absolute.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/non-absolute.s?rev=293748&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/non-absolute.s (added)
+++ lld/trunk/test/ELF/linkerscript/non-absolute.s Wed Feb  1 03:01:16 2017
@@ -0,0 +1,30 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o
+# RUN: echo "SECTIONS { A = . - 0x10; B = A + 0x1; }" > %t.script
+# RUN: ld.lld -shared %t1.o --script %t.script -o %t
+# RUN: llvm-objdump -d %t | FileCheck %s --check-prefix=DUMP
+# RUN: llvm-readobj -t %t | FileCheck %s --check-prefix=SYMBOL
+
+# DUMP:       Disassembly of section .text:
+# DUMP-NEXT:  foo:
+# DUMP-NEXT:   0: {{.*}} -21(%rip), %eax
+
+# SYMBOL:     Symbol {
+# SYMBOL:        Name: B
+# SYMBOL-NEXT:   Value: 0xFFFFFFFFFFFFFFF1
+# SYMBOL-NEXT:   Size: 0
+# SYMBOL-NEXT:   Binding: Local
+# SYMBOL-NEXT:   Type: None
+# SYMBOL-NEXT:   Other [
+# SYMBOL-NEXT:     STV_HIDDEN
+# SYMBOL-NEXT:   ]
+# SYMBOL-NEXT:   Section: .text
+# SYMBOL-NEXT: }
+
+.text
+.globl foo
+.type foo, @function
+foo:
+ movl B(%rip), %eax
+
+.hidden B




More information about the llvm-commits mailing list