[lld] r305323 - Set non alloc section address to 0 earlier.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 13 13:57:44 PDT 2017


Author: rafael
Date: Tue Jun 13 15:57:43 2017
New Revision: 305323

URL: http://llvm.org/viewvc/llvm-project?rev=305323&view=rev
Log:
Set non alloc section address to 0 earlier.

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 or if the
script has an explicit " : 0" setting the address of the output
section (which the default script does).

Modified:
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/test/ELF/linkerscript/locationcountererr2.s
    lld/trunk/test/ELF/linkerscript/symbols-non-alloc.s

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=305323&r1=305322&r2=305323&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Tue Jun 13 15:57:43 2017
@@ -142,10 +142,7 @@ void LinkerScript::assignSymbol(SymbolAs
     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 @@ void LinkerScript::assignOffsets(OutputS
   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 @@ void LinkerScript::assignAddresses(
     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);

Modified: lld/trunk/test/ELF/linkerscript/locationcountererr2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/locationcountererr2.s?rev=305323&r1=305322&r2=305323&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/locationcountererr2.s (original)
+++ lld/trunk/test/ELF/linkerscript/locationcountererr2.s Tue Jun 13 15:57:43 2017
@@ -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
 

Modified: lld/trunk/test/ELF/linkerscript/symbols-non-alloc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/symbols-non-alloc.s?rev=305323&r1=305322&r2=305323&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/symbols-non-alloc.s (original)
+++ lld/trunk/test/ELF/linkerscript/symbols-non-alloc.s Tue Jun 13 15:57:43 2017
@@ -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




More information about the llvm-commits mailing list