[elf2] Add __preinit_array, and __fini_array start and end symbols.

llvm-svn: 249367
This commit is contained in:
Michael J. Spencer 2015-10-06 01:16:17 +00:00
parent 8a9a8f3940
commit 95538ca99a
4 changed files with 101 additions and 31 deletions

View File

@ -329,13 +329,24 @@ template <class ELFT> void Writer<ELFT>::createSections() {
DynamicSec.FiniArraySec =
Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC});
if (OutputSection<ELFT> *OS = DynamicSec.InitArraySec) {
Symtab.addSyntheticSym<ELFT>("__init_array_start", *OS, 0);
Symtab.addSyntheticSym<ELFT>("__init_array_end", *OS, OS->getSize());
} else {
Symtab.addIgnoredSym<ELFT>("__init_array_start");
Symtab.addIgnoredSym<ELFT>("__init_array_end");
}
auto addStartEnd = [&Symtab](StringRef StartName, StringRef EndName,
OutputSection<ELFT> *OS) {
if (OS) {
Symtab.addSyntheticSym<ELFT>(StartName, *OS, 0);
Symtab.addSyntheticSym<ELFT>(EndName, *OS, OS->getSize());
}
else {
Symtab.addIgnoredSym<ELFT>(StartName);
Symtab.addIgnoredSym<ELFT>(EndName);
}
};
addStartEnd("__preinit_array_start", "__preinit_array_end",
DynamicSec.PreInitArraySec);
addStartEnd("__init_array_start", "__init_array_end",
DynamicSec.InitArraySec);
addStartEnd("__fini_array_start", "__fini_array_end",
DynamicSec.FiniArraySec);
// FIXME: Try to avoid the extra walk over all global symbols.
std::vector<DefinedCommon<ELFT> *> CommonSymbols;

View File

@ -1,18 +0,0 @@
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
// RUN: lld -flavor gnu2 %t -o %t2
// RUN: llvm-objdump -d %t2 | FileCheck %s
// REQUIRES: x86
.globl _start
_start:
call __init_array_start
call __init_array_end
// With no .init_array section the symbols resolve to 0
// 0 - (0x11000 + 5) = -69637
// 0 - (0x11005 + 5) = -69642
// CHECK: Disassembly of section .text:
// CHECK-NEXT: _start:
// CHECK-NEXT: 11000: e8 fb ef fe ff callq -69637
// CHECK-NEXT: 11005: e8 f6 ef fe ff callq -69642

View File

@ -8,8 +8,12 @@
.globl _start
_start:
call __preinit_array_start
call __preinit_array_end
call __init_array_start
call __init_array_end
call __fini_array_start
call __fini_array_end
.section .init_array,"aw",@init_array
@ -55,7 +59,25 @@ _start:
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: [[FINI_SIZE:.*]]
// CHECK: Name: __init_array_end
// CHECK: Name: __fini_array_end
// CHECK-NEXT: Value: 0x1301B
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .fini_array
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __fini_array_start
// CHECK-NEXT: Value: [[FINI_ADDR]]
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .fini_array
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __init_array_end
// CHECK-NEXT: Value: 0x13008
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
@ -72,7 +94,24 @@ _start:
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .init_array
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __preinit_array_end
// CHECK-NEXT: Value: 0x13011
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .preinit_array
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: __preinit_array_start
// CHECK-NEXT: Value: [[PREINIT_ADDR]]
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .preinit_array
// CHECK-NEXT: }
// CHECK: DynamicSection
// CHECK: PREINIT_ARRAY [[PREINIT_ADDR]]
@ -83,8 +122,16 @@ _start:
// CHECK: FINI_ARRAYSZ [[FINI_SIZE]] (bytes)
// 0x13000 - (0x12000 + 5) = 4091
// 0x13008 - (0x12005 + 5) = 4094
// 0x13008 - (0x12000 + 5) = 4099
// 0x13011 - (0x12005 + 5) = 4103
// 0x13000 - (0x1200a + 5) = 4081
// 0x13008 - (0x1200f + 5) = 4084
// 0x13011 - (0x12014 + 5) = 4088
// 0x1301B - (0x12019 + 5) = 4093
// DISASM: _start:
// DISASM-NEXT: 12000: e8 fb 0f 00 00 callq 4091
// DISASM-NEXT: 12005: e8 fe 0f 00 00 callq 4094
// DISASM-NEXT: 12000: e8 {{.*}} callq 4099
// DISASM-NEXT: 12005: e8 {{.*}} callq 4103
// DISASM-NEXT: 1200a: e8 {{.*}} callq 4081
// DISASM-NEXT: 1200f: e8 {{.*}} callq 4084
// DISASM-NEXT: 12014: e8 {{.*}} callq 4088
// DISASM-NEXT: 12019: e8 {{.*}} callq 4093

View File

@ -0,0 +1,30 @@
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
// RUN: lld -flavor gnu2 %t -o %t2
// RUN: llvm-objdump -d %t2 | FileCheck %s
// REQUIRES: x86
.globl _start
_start:
call __preinit_array_start
call __preinit_array_end
call __init_array_start
call __init_array_end
call __fini_array_start
call __fini_array_end
// With no .init_array section the symbols resolve to 0
// 0 - (0x11000 + 5) = -69637
// 0 - (0x11005 + 5) = -69642
// 0 - (0x1100a + 5) = -69647
// 0 - (0x1100f + 5) = -69652
// 0 - (0x11014 + 5) = -69657
// 0 - (0x11019 + 5) = -69662
// CHECK: Disassembly of section .text:
// CHECK-NEXT: _start:
// CHECK-NEXT: 11000: e8 fb ef fe ff callq -69637
// CHECK-NEXT: 11005: e8 f6 ef fe ff callq -69642
// CHECK-NEXT: 1100a: e8 f1 ef fe ff callq -69647
// CHECK-NEXT: 1100f: e8 ec ef fe ff callq -69652
// CHECK-NEXT: 11014: e8 e7 ef fe ff callq -69657
// CHECK-NEXT: 11019: e8 e2 ef fe ff callq -69662