forked from OSchip/llvm-project
[ELF] Fix DT_INIT_ARRAY{SZ} and DT_FINI_ARRAY{SZ}
The dynamic table was creating the entry DT_FINI_ARRAY{SZ} even when there was no .fini_array section. The entries should be creating in the dynamic section only if there are sections .init_array/.fini_array in the output. Fixes the tests that checked for errroneous outputs. llvm-svn: 221588
This commit is contained in:
parent
0abfc278f0
commit
7a82510348
|
@ -1068,10 +1068,6 @@ public:
|
|||
_dt_strsz = addEntry(dyn);
|
||||
dyn.d_tag = DT_SYMENT;
|
||||
_dt_syment = addEntry(dyn);
|
||||
dyn.d_tag = DT_FINI_ARRAY;
|
||||
_dt_fini_array = addEntry(dyn);
|
||||
dyn.d_tag = DT_FINI_ARRAYSZ;
|
||||
_dt_fini_arraysz = addEntry(dyn);
|
||||
if (_layout.hasDynamicRelocationTable()) {
|
||||
dyn.d_tag = isRela ? DT_RELA : DT_REL;
|
||||
_dt_rela = addEntry(dyn);
|
||||
|
@ -1099,6 +1095,25 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
virtual void doPreFlight() {
|
||||
Elf_Dyn dyn;
|
||||
dyn.d_un.d_val = 0;
|
||||
auto initArray = _layout.findOutputSection(".init_array");
|
||||
auto finiArray = _layout.findOutputSection(".fini_array");
|
||||
if (initArray) {
|
||||
dyn.d_tag = DT_INIT_ARRAY;
|
||||
_dt_init_array = addEntry(dyn);
|
||||
dyn.d_tag = DT_INIT_ARRAYSZ;
|
||||
_dt_init_arraysz = addEntry(dyn);
|
||||
}
|
||||
if (finiArray) {
|
||||
dyn.d_tag = DT_FINI_ARRAY;
|
||||
_dt_fini_array = addEntry(dyn);
|
||||
dyn.d_tag = DT_FINI_ARRAYSZ;
|
||||
_dt_fini_arraysz = addEntry(dyn);
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Dynamic table tag for .got.plt section referencing.
|
||||
/// Usually but not always targets use DT_PLTGOT for that.
|
||||
virtual int64_t getGotPltTag() { return DT_PLTGOT; }
|
||||
|
@ -1132,6 +1147,11 @@ public:
|
|||
_entries[_dt_symtab].d_un.d_val = _dynamicSymbolTable->virtualAddr();
|
||||
_entries[_dt_strsz].d_un.d_val = dynamicStringTable->memSize();
|
||||
_entries[_dt_syment].d_un.d_val = _dynamicSymbolTable->getEntSize();
|
||||
auto initArray = _layout.findOutputSection(".init_array");
|
||||
if (initArray) {
|
||||
_entries[_dt_init_array].d_un.d_val = initArray->virtualAddr();
|
||||
_entries[_dt_init_arraysz].d_un.d_val = initArray->memSize();
|
||||
}
|
||||
auto finiArray = _layout.findOutputSection(".fini_array");
|
||||
if (finiArray) {
|
||||
_entries[_dt_fini_array].d_un.d_val = finiArray->virtualAddr();
|
||||
|
@ -1168,6 +1188,8 @@ private:
|
|||
std::size_t _dt_pltgot;
|
||||
std::size_t _dt_pltrel;
|
||||
std::size_t _dt_jmprel;
|
||||
std::size_t _dt_init_array;
|
||||
std::size_t _dt_init_arraysz;
|
||||
std::size_t _dt_fini_array;
|
||||
std::size_t _dt_fini_arraysz;
|
||||
std::size_t _dt_textrel;
|
||||
|
|
|
@ -5,15 +5,13 @@
|
|||
# RUN: lld -flavor gnu -target mipsel --noinhibit-exec -o %t.exe %t.o
|
||||
# RUN: llvm-readobj -dynamic-table -program-headers %t.exe | FileCheck %s
|
||||
|
||||
# CHECK: DynamicSection [ (15 entries)
|
||||
# CHECK: DynamicSection [ (13 entries)
|
||||
# CHECK: Tag Type Name/Value
|
||||
# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}}
|
||||
# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}}
|
||||
# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}}
|
||||
# CHECK-NEXT: 0x0000000A STRSZ 1 (bytes)
|
||||
# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
|
||||
# CHECK-NEXT: 0x0000001A FINI_ARRAY 0x0
|
||||
# CHECK-NEXT: 0x0000001C FINI_ARRAYSZ 0 (bytes)
|
||||
# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1
|
||||
# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT
|
||||
# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000
|
||||
|
|
|
@ -9,15 +9,13 @@
|
|||
# CHECK: Arch: mipsel
|
||||
# CHECK: AddressSize: 32bit
|
||||
# CHECK: LoadName:
|
||||
# CHECK: DynamicSection [ (15 entries)
|
||||
# CHECK: DynamicSection [ (13 entries)
|
||||
# CHECK: Tag Type Name/Value
|
||||
# CHECK-NEXT: 0x00000004 HASH 0x{{[0-9A-F]+}}
|
||||
# CHECK-NEXT: 0x00000005 STRTAB 0x{{[0-9A-F]+}}
|
||||
# CHECK-NEXT: 0x00000006 SYMTAB 0x{{[0-9A-F]+}}
|
||||
# CHECK-NEXT: 0x0000000A STRSZ 17 (bytes)
|
||||
# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
|
||||
# CHECK-NEXT: 0x0000001A FINI_ARRAY 0x0
|
||||
# CHECK-NEXT: 0x0000001C FINI_ARRAYSZ 0 (bytes)
|
||||
# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1
|
||||
# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT
|
||||
# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x0
|
||||
|
|
|
@ -13,15 +13,13 @@
|
|||
# CHECK: Arch: mipsel
|
||||
# CHECK: AddressSize: 32bit
|
||||
# CHECK: LoadName:
|
||||
# CHECK: DynamicSection [ (20 entries)
|
||||
# CHECK: DynamicSection [ (18 entries)
|
||||
# CHECK: Tag Type Name/Value
|
||||
# CHECK-NEXT: 0x00000004 HASH 0x400110
|
||||
# CHECK-NEXT: 0x00000005 STRTAB 0x400144
|
||||
# CHECK-NEXT: 0x00000006 SYMTAB 0x400124
|
||||
# CHECK-NEXT: 0x0000000A STRSZ 28 (bytes)
|
||||
# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes)
|
||||
# CHECK-NEXT: 0x0000001A FINI_ARRAY 0x0
|
||||
# CHECK-NEXT: 0x0000001C FINI_ARRAYSZ 0 (bytes)
|
||||
# CHECK-NEXT: 0x00000002 PLTRELSZ 8 (bytes)
|
||||
# CHECK-NEXT: 0x70000032 MIPS_PLTGOT 0x402000
|
||||
# CHECK-NEXT: 0x00000014 PLTREL REL
|
||||
|
|
|
@ -60,15 +60,13 @@ CHECK-NEXT: Binding: Global
|
|||
CHECK-NEXT: Type: Function
|
||||
CHECK: }
|
||||
|
||||
CHECK: DynamicSection [ (17 entries)
|
||||
CHECK: DynamicSection [ (15 entries)
|
||||
CHECK: Tag Type Name/Value
|
||||
CHECK: 0x0000000000000004 HASH
|
||||
CHECK: 0x0000000000000005 STRTAB
|
||||
CHECK: 0x0000000000000006 SYMTAB
|
||||
CHECK: 0x000000000000000A STRSZ
|
||||
CHECK: 0x000000000000000B SYMENT 24
|
||||
CHECK: 0x000000000000001A FINI_ARRAY
|
||||
CHECK: 0x000000000000001C FINI_ARRAYSZ
|
||||
CHECK: 0x0000000000000007 RELA
|
||||
CHECK: 0x0000000000000008 RELASZ 24
|
||||
CHECK: 0x0000000000000009 RELAENT 24
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
#
|
||||
# CHECK: 004001e0 T main
|
||||
# CHECK: 00401000 D _DYNAMIC
|
||||
# CHECK: 00401080 A _end
|
||||
# CHECK: 00401080 A end
|
||||
# CHECK: 00401060 A _end
|
||||
# CHECK: 00401060 A end
|
||||
# CHECK: U _entrypoint
|
||||
|
||||
defined-atoms:
|
||||
|
|
|
@ -36,8 +36,8 @@ I386-NEXT: Type: PT_LOAD (0x1)
|
|||
I386-NEXT: Offset: 0x0
|
||||
I386-NEXT: VirtualAddress: 0x0
|
||||
I386-NEXT: PhysicalAddress: 0x0
|
||||
I386-NEXT: FileSize: 572
|
||||
I386-NEXT: MemSize: 572
|
||||
I386-NEXT: FileSize: 556
|
||||
I386-NEXT: MemSize: 556
|
||||
I386-NEXT: Flags [ (0x5)
|
||||
I386-NEXT: PF_R (0x4)
|
||||
I386-NEXT: PF_X (0x1)
|
||||
|
@ -87,8 +87,8 @@ I386-NEXT: Type: PT_DYNAMIC (0x2)
|
|||
I386-NEXT: Offset: 0x1FC
|
||||
I386-NEXT: VirtualAddress: 0x1FC
|
||||
I386-NEXT: PhysicalAddress: 0x1FC
|
||||
I386-NEXT: FileSize: 64
|
||||
I386-NEXT: MemSize: 64
|
||||
I386-NEXT: FileSize: 48
|
||||
I386-NEXT: MemSize: 48
|
||||
I386-NEXT: Flags [ (0x4)
|
||||
I386-NEXT: PF_R (0x4)
|
||||
I386-NEXT: ]
|
||||
|
|
Loading…
Reference in New Issue