[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:
Shankar Easwaran 2014-11-10 14:55:11 +00:00
parent 0abfc278f0
commit 7a82510348
7 changed files with 42 additions and 28 deletions

View File

@ -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;

View File

@ -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

View File

@ -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
@ -28,14 +26,14 @@
# CHECK-NEXT: 0x00000000 NULL 0x0
# CHECK-NEXT: ]
FileHeader:
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_MIPS
Flags: [ EF_MIPS_PIC, EF_MIPS_CPIC,
EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]
Sections:
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
@ -46,7 +44,7 @@ Sections:
Link: .symtab
AddressAlign: 0x04
Info: .text
Relocations:
Relocations:
- Offset: 0x00
Symbol: '$.str1'
Type: R_MIPS_GOT16
@ -84,8 +82,8 @@ Sections:
AddressAlign: 0x01
Size: 0x05
Symbols:
Local:
Symbols:
Local:
- Name: '$.str1'
Section: .rodata.str1
- Name: '$.str2'
@ -105,7 +103,7 @@ Symbols:
- Name: .rodata.str2
Type: STT_SECTION
Section: .rodata.str2
Global:
Global:
- Name: glob
Section: .text
- Name: ext1

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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: ]