[lld] r294322 - [ELF] - Assign proper values for DefinedSynthetic symbols attached to non-allocatable sections.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 7 09:51:35 PST 2017


Author: grimar
Date: Tue Feb  7 11:51:35 2017
New Revision: 294322

URL: http://llvm.org/viewvc/llvm-project?rev=294322&view=rev
Log:
[ELF] - Assign proper values for DefinedSynthetic symbols attached to non-allocatable sections.

DefinedSynthetic symbols are attached to sections,
for the case when such symbol was attached to non-allocated section,
we calculated its value incorrectly.

We subtracted Body->Section->Addr, but non-allocatable sections
should have zero VA in output and therefore result value was wrong.

And at the same time we have Body->Section->Addr != 0 for them 
internally because  use it for calculation of section size.

Patch fixes calculation of such symbols values.

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

Added:
    lld/trunk/test/ELF/linkerscript/symbols-and-orphans.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=294322&r1=294321&r2=294322&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Tue Feb  7 11:51:35 2017
@@ -101,8 +101,12 @@ static void assignSymbol(SymbolAssignmen
 
   if (auto *Body = dyn_cast<DefinedSynthetic>(Cmd->Sym)) {
     Body->Section = Cmd->Expression.Section();
-    if (Body->Section)
-      Body->Value = Cmd->Expression(Dot) - Body->Section->Addr;
+    if (Body->Section) {
+      uint64_t VA = 0;
+      if (Body->Section->Flags & SHF_ALLOC)
+        VA = Body->Section->Addr;
+      Body->Value = Cmd->Expression(Dot) - VA;
+    }
     return;
   }
 

Added: lld/trunk/test/ELF/linkerscript/symbols-and-orphans.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbols-and-orphans.s?rev=294322&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/symbols-and-orphans.s (added)
+++ lld/trunk/test/ELF/linkerscript/symbols-and-orphans.s Tue Feb  7 11:51:35 2017
@@ -0,0 +1,16 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+
+# RUN: echo "SECTIONS { . = SIZEOF_HEADERS; \
+# RUN:  .text : { *(.text) }                \
+# RUN:  .nonalloc : { *(.nonalloc) }        \
+# RUN:  Sym = .;                            \
+# RUN:  }" > %t.script
+# RUN: ld.lld -o %t2 --script %t.script %t
+# RUN: llvm-objdump -section-headers -t %t2 | FileCheck %s
+
+# CHECK: SYMBOL TABLE:
+# CHECK:  00000000000000f0 .nonalloc 00000000 Sym
+
+.section .nonalloc,""
+ .quad 0




More information about the llvm-commits mailing list