Index: ELF/OutputSections.h =================================================================== --- ELF/OutputSections.h +++ ELF/OutputSections.h @@ -585,9 +585,9 @@ uint64_t Val; const SymbolBody *Sym; }; - enum KindT { SecAddr, SymAddr, PlainInt } Kind; - Entry(int32_t Tag, OutputSectionBase *OutSec) - : Tag(Tag), OutSec(OutSec), Kind(SecAddr) {} + enum KindT { SecAddr, SecSize, SymAddr, PlainInt } Kind; + Entry(int32_t Tag, OutputSectionBase *OutSec, KindT Kind) + : 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) {} Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -657,39 +657,39 @@ if (Out::RelaDyn->hasRelocs()) { bool IsRela = Config->Rela; - Add({IsRela ? DT_RELA : DT_REL, Out::RelaDyn}); + Add({IsRela ? DT_RELA : DT_REL, Out::RelaDyn, Entry::SecAddr}); Add({IsRela ? DT_RELASZ : DT_RELSZ, Out::RelaDyn->getSize()}); Add({IsRela ? DT_RELAENT : DT_RELENT, uintX_t(IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel))}); } if (Out::RelaPlt && Out::RelaPlt->hasRelocs()) { - Add({DT_JMPREL, Out::RelaPlt}); + Add({DT_JMPREL, Out::RelaPlt, Entry::SecAddr}); Add({DT_PLTRELSZ, Out::RelaPlt->getSize()}); Add({Config->EMachine == EM_MIPS ? DT_MIPS_PLTGOT : DT_PLTGOT, - Out::GotPlt}); + Out::GotPlt, Entry::SecAddr}); Add({DT_PLTREL, uint64_t(Config->Rela ? DT_RELA : DT_REL)}); } - Add({DT_SYMTAB, Out::DynSymTab}); + Add({DT_SYMTAB, Out::DynSymTab, Entry::SecAddr}); Add({DT_SYMENT, sizeof(Elf_Sym)}); - Add({DT_STRTAB, Out::DynStrTab}); + Add({DT_STRTAB, Out::DynStrTab, Entry::SecAddr}); Add({DT_STRSZ, Out::DynStrTab->getSize()}); if (Out::GnuHashTab) - Add({DT_GNU_HASH, Out::GnuHashTab}); + Add({DT_GNU_HASH, Out::GnuHashTab, Entry::SecAddr}); if (Out::HashTab) - Add({DT_HASH, Out::HashTab}); + Add({DT_HASH, Out::HashTab, Entry::SecAddr}); if (Out::PreinitArray) { - Add({DT_PREINIT_ARRAY, Out::PreinitArray}); - Add({DT_PREINIT_ARRAYSZ, Out::PreinitArray->getSize()}); + Add({DT_PREINIT_ARRAY, Out::PreinitArray, Entry::SecAddr}); + Add({DT_PREINIT_ARRAYSZ, Out::PreinitArray, Entry::SecSize}); } if (Out::InitArray) { - Add({DT_INIT_ARRAY, Out::InitArray}); - Add({DT_INIT_ARRAYSZ, (uintX_t)Out::InitArray->getSize()}); + Add({DT_INIT_ARRAY, Out::InitArray, Entry::SecAddr}); + Add({DT_INIT_ARRAYSZ, Out::InitArray, Entry::SecSize}); } if (Out::FiniArray) { - Add({DT_FINI_ARRAY, Out::FiniArray}); - Add({DT_FINI_ARRAYSZ, (uintX_t)Out::FiniArray->getSize()}); + Add({DT_FINI_ARRAY, Out::FiniArray, Entry::SecAddr}); + Add({DT_FINI_ARRAYSZ, Out::FiniArray, Entry::SecSize}); } if (SymbolBody *B = Symtab::X->find(Config->Init)) @@ -722,13 +722,13 @@ bool HasVerNeed = Out::VerNeed->getNeedNum() != 0; if (HasVerNeed || Out::VerDef) - Add({DT_VERSYM, Out::VerSym}); + Add({DT_VERSYM, Out::VerSym, Entry::SecAddr}); if (Out::VerDef) { - Add({DT_VERDEF, Out::VerDef}); + Add({DT_VERDEF, Out::VerDef, Entry::SecAddr}); Add({DT_VERDEFNUM, getVerDefNum()}); } if (HasVerNeed) { - Add({DT_VERNEED, Out::VerNeed}); + Add({DT_VERNEED, Out::VerNeed, Entry::SecAddr}); Add({DT_VERNEEDNUM, Out::VerNeed->getNeedNum()}); } @@ -742,9 +742,9 @@ Add({DT_MIPS_GOTSYM, B->DynsymIndex}); else Add({DT_MIPS_GOTSYM, Out::DynSymTab->getNumSymbols()}); - Add({DT_PLTGOT, Out::Got}); + Add({DT_PLTGOT, Out::Got, Entry::SecAddr}); if (Out::MipsRldMap) - Add({DT_MIPS_RLD_MAP, Out::MipsRldMap}); + Add({DT_MIPS_RLD_MAP, Out::MipsRldMap, Entry::SecAddr}); } // +1 for DT_NULL @@ -760,6 +760,9 @@ 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(); break; Index: test/ELF/linkerscript/linkerscript-dynamic.s =================================================================== --- test/ELF/linkerscript/linkerscript-dynamic.s +++ 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