[PATCH] D34123: Set non alloc section address to 0 earlier

Rafael Ávila de Espíndola via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 12 16:34:38 PDT 2017


rafael created this revision.
Herald added a subscriber: emaste.

Currently we do layout as if non alloc sections had an actual address and then set it to zero. This produces a few odd results where a symbol has an address that is inconsistent with the section address.

The simplest way to fix it is probably to just set the address earlier.

The behavior of bfd seems to be similar, but it only sets the non alloc section address is missing from the linker script of if the script has an explicit " : 0" setting the address of the output section (which the default script does).


https://reviews.llvm.org/D34123

Files:
  ELF/LinkerScript.cpp
  test/ELF/linkerscript/locationcountererr2.s
  test/ELF/linkerscript/symbols-non-alloc.s


Index: test/ELF/linkerscript/symbols-non-alloc.s
===================================================================
--- test/ELF/linkerscript/symbols-non-alloc.s
+++ test/ELF/linkerscript/symbols-non-alloc.s
@@ -13,7 +13,7 @@
 # CHECK:  .nonalloc     00000008 0000000000000000
 
 # CHECK: SYMBOL TABLE:
-# CHECK:  00000000000000f0 .nonalloc 00000000 Sym
+# CHECK:  0000000000000008 .nonalloc 00000000 Sym
 
 .section .nonalloc,""
  .quad 0
Index: test/ELF/linkerscript/locationcountererr2.s
===================================================================
--- test/ELF/linkerscript/locationcountererr2.s
+++ test/ELF/linkerscript/locationcountererr2.s
@@ -1,7 +1,7 @@
 # REQUIRES: x86
 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
 # RUN: echo "SECTIONS {" > %t.script
-# RUN: echo ". = 0x20; . = 0x10; }" >> %t.script
+# RUN: echo ". = 0x20; . = 0x10; .text : {} }" >> %t.script
 # RUN: not ld.lld %t.o --script %t.script -o %t -shared 2>&1 | FileCheck %s
 # CHECK: {{.*}}.script:2: unable to move location counter backward
 
Index: ELF/LinkerScript.cpp
===================================================================
--- ELF/LinkerScript.cpp
+++ ELF/LinkerScript.cpp
@@ -142,10 +142,7 @@
     Sym->Value = V.getValue();
   } else {
     Sym->Section = V.Sec;
-    if (Sym->Section->Flags & SHF_ALLOC)
-      Sym->Value = alignTo(V.Val, V.Alignment);
-    else
-      Sym->Value = V.getValue();
+    Sym->Value = alignTo(V.Val, V.Alignment);
   }
 }
 
@@ -649,7 +646,9 @@
   if (!Sec)
     return;
 
-  if (Cmd->AddrExpr && (Sec->Flags & SHF_ALLOC))
+  if (!(Sec->Flags & SHF_ALLOC))
+    Dot = 0;
+  else if (Cmd->AddrExpr)
     setDot(Cmd->AddrExpr, Cmd->Location, false);
 
   if (Cmd->LMAExpr) {
@@ -950,8 +949,6 @@
     OutputSection *Sec = Cmd->Sec;
     if (Sec->Flags & SHF_ALLOC)
       MinVA = std::min<uint64_t>(MinVA, Sec->Addr);
-    else
-      Sec->Addr = 0;
   }
 
   allocateHeaders(Phdrs, OutputSectionCommands, MinVA);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34123.102259.patch
Type: text/x-patch
Size: 1966 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170612/fac744b1/attachment.bin>


More information about the llvm-commits mailing list