diff options
author | George Rimar <grimar@accesssoftek.com> | 2016-08-19 15:23:39 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2016-08-19 15:23:39 +0000 |
commit | 03e0560da77f47bdb70947efce7b8639d0f77f0d (patch) | |
tree | 95371bdf287d9b15f8d45d2f47ba2b1bd3c5af4d | |
parent | 14cdf1968f0fc5463799c234a21876f6c5434345 (diff) | |
download | bcm5719-llvm-03e0560da77f47bdb70947efce7b8639d0f77f0d.tar.gz bcm5719-llvm-03e0560da77f47bdb70947efce7b8639d0f77f0d.zip |
[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
llvm-svn: 279258
-rw-r--r-- | lld/ELF/OutputSections.cpp | 9 | ||||
-rw-r--r-- | lld/ELF/OutputSections.h | 6 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/linkerscript-dynamic.s | 28 |
3 files changed, 37 insertions, 6 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 972457ae43a..02539f5c546 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -681,15 +681,15 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() { 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 DynamicSection<ELFT>::writeTo(uint8_t *Buf) { 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; diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index b587c00b495..9af207b9182 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -585,9 +585,9 @@ class DynamicSection final : public OutputSectionBase<ELFT> { 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) {} diff --git a/lld/test/ELF/linkerscript/linkerscript-dynamic.s b/lld/test/ELF/linkerscript/linkerscript-dynamic.s new file mode 100644 index 00000000000..ab65ab831f8 --- /dev/null +++ b/lld/test/ELF/linkerscript/linkerscript-dynamic.s @@ -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",@init_array + .quad 0 + +.section .preinit_array,"aw",@preinit_array + .quad 0 + .byte 0 + +.section .fini_array,"aw",@fini_array + .quad 0 + .short 0 |