[lld] r279258 - [ELF] - Linkerscript: set correct dynamic tag entries values when LS is used.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 19 08:23:39 PDT 2016


Author: grimar
Date: Fri Aug 19 10:23:39 2016
New Revision: 279258

URL: http://llvm.org/viewvc/llvm-project?rev=279258&view=rev
Log:
[ELF] - Linkerscript: set correct dynamic tag entries values when LS is used.

Previously DT_PREINIT_ARRAYSZ, DT_INIT_ARRAYSZ and DT_FINI_ARRAYSZ
were set to zero when lincerscript was used becase sections sizes are
calculated later that were taken.

Patch delays values calculation for these entries. Testcase is provided.

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

Added:
    lld/trunk/test/ELF/linkerscript/linkerscript-dynamic.s
Modified:
    lld/trunk/ELF/OutputSections.cpp
    lld/trunk/ELF/OutputSections.h

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=279258&r1=279257&r2=279258&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Fri Aug 19 10:23:39 2016
@@ -681,15 +681,15 @@ template <class ELFT> void DynamicSectio
 
   if (Out<ELFT>::PreinitArray) {
     Add({DT_PREINIT_ARRAY, Out<ELFT>::PreinitArray});
-    Add({DT_PREINIT_ARRAYSZ, Out<ELFT>::PreinitArray->getSize()});
+    Add({DT_PREINIT_ARRAYSZ, Out<ELFT>::PreinitArray, Entry::SecSize});
   }
   if (Out<ELFT>::InitArray) {
     Add({DT_INIT_ARRAY, Out<ELFT>::InitArray});
-    Add({DT_INIT_ARRAYSZ, (uintX_t)Out<ELFT>::InitArray->getSize()});
+    Add({DT_INIT_ARRAYSZ, Out<ELFT>::InitArray, Entry::SecSize});
   }
   if (Out<ELFT>::FiniArray) {
     Add({DT_FINI_ARRAY, Out<ELFT>::FiniArray});
-    Add({DT_FINI_ARRAYSZ, (uintX_t)Out<ELFT>::FiniArray->getSize()});
+    Add({DT_FINI_ARRAYSZ, Out<ELFT>::FiniArray, Entry::SecSize});
   }
 
   if (SymbolBody *B = Symtab<ELFT>::X->find(Config->Init))
@@ -760,6 +760,9 @@ template <class ELFT> void DynamicSectio
     case Entry::SecAddr:
       P->d_un.d_ptr = E.OutSec->getVA();
       break;
+    case Entry::SecSize:
+      P->d_un.d_val = E.OutSec->getSize();
+      break;
     case Entry::SymAddr:
       P->d_un.d_ptr = E.Sym->template getVA<ELFT>();
       break;

Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=279258&r1=279257&r2=279258&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Fri Aug 19 10:23:39 2016
@@ -585,9 +585,9 @@ class DynamicSection final : public Outp
       uint64_t Val;
       const SymbolBody *Sym;
     };
-    enum KindT { SecAddr, SymAddr, PlainInt } Kind;
-    Entry(int32_t Tag, OutputSectionBase<ELFT> *OutSec)
-        : Tag(Tag), OutSec(OutSec), Kind(SecAddr) {}
+    enum KindT { SecAddr, SecSize, SymAddr, PlainInt } Kind;
+    Entry(int32_t Tag, OutputSectionBase<ELFT> *OutSec, KindT Kind = SecAddr)
+        : Tag(Tag), OutSec(OutSec), Kind(Kind) {}
     Entry(int32_t Tag, uint64_t Val) : Tag(Tag), Val(Val), Kind(PlainInt) {}
     Entry(int32_t Tag, const SymbolBody *Sym)
         : Tag(Tag), Sym(Sym), Kind(SymAddr) {}

Added: lld/trunk/test/ELF/linkerscript/linkerscript-dynamic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/linkerscript-dynamic.s?rev=279258&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/linkerscript-dynamic.s (added)
+++ lld/trunk/test/ELF/linkerscript/linkerscript-dynamic.s Fri Aug 19 10:23:39 2016
@@ -0,0 +1,28 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o
+# RUN: ld.lld -shared %t2.o -o %t2.so
+
+# RUN: echo "SECTIONS { }" > %t.script
+# RUN: ld.lld %t1.o %t2.so -o %t
+# RUN: llvm-readobj -dynamic-table %t | FileCheck %s
+
+# CHECK:      DynamicSection [
+# CHECK-NEXT:  Tag                 Type             Name/Value
+# CHECK:       0x0000000000000021  PREINIT_ARRAYSZ  9 (bytes)
+# CHECK:       0x000000000000001B  INIT_ARRAYSZ     8 (bytes)
+# CHECK:       0x000000000000001C  FINI_ARRAYSZ     10 (bytes)
+
+.globl _start
+_start:
+
+.section .init_array,"aw", at init_array
+  .quad 0
+
+.section .preinit_array,"aw", at preinit_array
+  .quad 0
+  .byte 0
+
+.section .fini_array,"aw", at fini_array
+  .quad 0
+  .short 0




More information about the llvm-commits mailing list