[PATCH] D23663: [ELF] - Linkerscript: set correct synamic tag entries values when LS is used.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 19 01:59:03 PDT 2016
grimar updated this revision to Diff 68662.
grimar added a comment.
- Addressed review comments.
https://reviews.llvm.org/D23663
Files:
ELF/OutputSections.cpp
ELF/OutputSections.h
test/ELF/linkerscript/linkerscript-dynamic.s
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", 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
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<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) {}
Index: ELF/OutputSections.cpp
===================================================================
--- ELF/OutputSections.cpp
+++ ELF/OutputSections.cpp
@@ -681,15 +681,15 @@
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 @@
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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23663.68662.patch
Type: text/x-patch
Size: 3098 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160819/d80b9273/attachment.bin>
More information about the llvm-commits
mailing list