[elf2] Add __preinit_array, and __fini_array start and end symbols.
llvm-svn: 249367
This commit is contained in:
parent
8a9a8f3940
commit
95538ca99a
|
@ -329,13 +329,24 @@ template <class ELFT> void Writer<ELFT>::createSections() {
|
||||||
DynamicSec.FiniArraySec =
|
DynamicSec.FiniArraySec =
|
||||||
Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC});
|
Map.lookup({".fini_array", SHT_FINI_ARRAY, SHF_WRITE | SHF_ALLOC});
|
||||||
|
|
||||||
if (OutputSection<ELFT> *OS = DynamicSec.InitArraySec) {
|
auto addStartEnd = [&Symtab](StringRef StartName, StringRef EndName,
|
||||||
Symtab.addSyntheticSym<ELFT>("__init_array_start", *OS, 0);
|
OutputSection<ELFT> *OS) {
|
||||||
Symtab.addSyntheticSym<ELFT>("__init_array_end", *OS, OS->getSize());
|
if (OS) {
|
||||||
} else {
|
Symtab.addSyntheticSym<ELFT>(StartName, *OS, 0);
|
||||||
Symtab.addIgnoredSym<ELFT>("__init_array_start");
|
Symtab.addSyntheticSym<ELFT>(EndName, *OS, OS->getSize());
|
||||||
Symtab.addIgnoredSym<ELFT>("__init_array_end");
|
}
|
||||||
}
|
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.
|
// FIXME: Try to avoid the extra walk over all global symbols.
|
||||||
std::vector<DefinedCommon<ELFT> *> CommonSymbols;
|
std::vector<DefinedCommon<ELFT> *> CommonSymbols;
|
||||||
|
|
|
@ -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
|
|
|
@ -8,8 +8,12 @@
|
||||||
|
|
||||||
.globl _start
|
.globl _start
|
||||||
_start:
|
_start:
|
||||||
|
call __preinit_array_start
|
||||||
|
call __preinit_array_end
|
||||||
call __init_array_start
|
call __init_array_start
|
||||||
call __init_array_end
|
call __init_array_end
|
||||||
|
call __fini_array_start
|
||||||
|
call __fini_array_end
|
||||||
|
|
||||||
|
|
||||||
.section .init_array,"aw",@init_array
|
.section .init_array,"aw",@init_array
|
||||||
|
@ -55,7 +59,25 @@ _start:
|
||||||
// CHECK-NEXT: Offset:
|
// CHECK-NEXT: Offset:
|
||||||
// CHECK-NEXT: Size: [[FINI_SIZE:.*]]
|
// 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: Value: 0x13008
|
||||||
// CHECK-NEXT: Size: 0
|
// CHECK-NEXT: Size: 0
|
||||||
// CHECK-NEXT: Binding: Local
|
// CHECK-NEXT: Binding: Local
|
||||||
|
@ -72,7 +94,24 @@ _start:
|
||||||
// CHECK-NEXT: Other: 0
|
// CHECK-NEXT: Other: 0
|
||||||
// CHECK-NEXT: Section: .init_array
|
// CHECK-NEXT: Section: .init_array
|
||||||
// CHECK-NEXT: }
|
// 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: DynamicSection
|
||||||
// CHECK: PREINIT_ARRAY [[PREINIT_ADDR]]
|
// CHECK: PREINIT_ARRAY [[PREINIT_ADDR]]
|
||||||
|
@ -83,8 +122,16 @@ _start:
|
||||||
// CHECK: FINI_ARRAYSZ [[FINI_SIZE]] (bytes)
|
// CHECK: FINI_ARRAYSZ [[FINI_SIZE]] (bytes)
|
||||||
|
|
||||||
|
|
||||||
// 0x13000 - (0x12000 + 5) = 4091
|
// 0x13008 - (0x12000 + 5) = 4099
|
||||||
// 0x13008 - (0x12005 + 5) = 4094
|
// 0x13011 - (0x12005 + 5) = 4103
|
||||||
|
// 0x13000 - (0x1200a + 5) = 4081
|
||||||
|
// 0x13008 - (0x1200f + 5) = 4084
|
||||||
|
// 0x13011 - (0x12014 + 5) = 4088
|
||||||
|
// 0x1301B - (0x12019 + 5) = 4093
|
||||||
// DISASM: _start:
|
// DISASM: _start:
|
||||||
// DISASM-NEXT: 12000: e8 fb 0f 00 00 callq 4091
|
// DISASM-NEXT: 12000: e8 {{.*}} callq 4099
|
||||||
// DISASM-NEXT: 12005: e8 fe 0f 00 00 callq 4094
|
// 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
|
|
@ -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
|
Loading…
Reference in New Issue