forked from OSchip/llvm-project
[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
This commit is contained in:
parent
14cdf1968f
commit
03e0560da7
|
@ -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;
|
||||
|
|
|
@ -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) {}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue