[PATCH] D29653: [ELF] - Assign proper values for DefinedSynthetic symbols attached to non-allocatable sections.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 7 08:26:56 PST 2017


grimar created this revision.

We currently have next issue. In the script from testcase,
orphans are placed before symbol asignment because of align expression.

Therefore .Sym is attached to non allocatable section. And we calculate it
value wrong. We subtract Body->Section->Addr, but non-allocatable sections
should have zero VA in output and therefore result value is wrong,

We have Body->Section->Addr != 0 for them internally because use it for calculation of size.
Patch fixes calculation of such symbols values.


https://reviews.llvm.org/D29653

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/symbols-and-orphans.s


Index: test/ELF/linkerscript/symbols-and-orphans.s
===================================================================
--- test/ELF/linkerscript/symbols-and-orphans.s
+++ test/ELF/linkerscript/symbols-and-orphans.s
@@ -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:  . = ALIGN(8);                       \
+# RUN:  Sym = .; }" > %t.script
+# RUN: ld.lld -o %t2 --script %t.script %t
+# RUN: llvm-objdump -section-headers -t %t2 | FileCheck %s
+
+# CHECK:      SYMBOL TABLE:
+# CHECK-NEXT: 0000000000000000 *UND* 00000000
+# CHECK-NEXT: 0000000000000160 .strtab 00000000 Sym
+
+.section .orphan,""
+ .quad 0
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -101,8 +101,12 @@
 
   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;
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29653.87449.patch
Type: text/x-patch
Size: 1332 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170207/dfa65b41/attachment.bin>


More information about the llvm-commits mailing list