1// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
2// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2
3// RUN: ld.lld %t2 -o %t2.so -shared
4// RUN: ld.lld %t %t2.so -o %t2
5// RUN: llvm-readobj -r -symbols -sections -dynamic-table %t2 | FileCheck %s
6// RUN: llvm-objdump -d %t2 | FileCheck --check-prefix=DISASM %s
7// REQUIRES: x86
8
9.globl _start
10_start:
11  call __preinit_array_start
12  call __preinit_array_end
13  call __init_array_start
14  call __init_array_end
15  call __fini_array_start
16  call __fini_array_end
17
18
19.section .init_array,"aw",@init_array
20  .quad 0
21
22.section .preinit_array,"aw",@preinit_array
23        .quad 0
24        .byte 0
25
26.section .fini_array,"aw",@fini_array
27        .quad 0
28        .short 0
29
30// CHECK:      Name: .init_array
31// CHECK-NEXT: Type: SHT_INIT_ARRAY
32// CHECK-NEXT: Flags [
33// CHECK-NEXT:   SHF_ALLOC
34// CHECK-NEXT:   SHF_WRITE
35// CHECK-NEXT: ]
36// CHECK-NEXT: Address: [[INIT_ADDR:.*]]
37// CHECK-NEXT: Offset:
38// CHECK-NEXT: Size: [[INIT_SIZE:.*]]
39
40
41// CHECK:     Name: .preinit_array
42// CHECK-NEXT: Type: SHT_PREINIT_ARRAY
43// CHECK-NEXT: Flags [
44// CHECK-NEXT:   SHF_ALLOC
45// CHECK-NEXT:   SHF_WRITE
46// CHECK-NEXT:    ]
47// CHECK-NEXT: Address: [[PREINIT_ADDR:.*]]
48// CHECK-NEXT: Offset:
49// CHECK-NEXT: Size: [[PREINIT_SIZE:.*]]
50
51
52// CHECK:      Name: .fini_array
53// CHECK-NEXT: Type: SHT_FINI_ARRAY
54// CHECK-NEXT: Flags [
55// CHECK-NEXT:   SHF_ALLOC
56// CHECK-NEXT:   SHF_WRITE
57// CHECK-NEXT: ]
58// CHECK-NEXT: Address: [[FINI_ADDR:.*]]
59// CHECK-NEXT: Offset:
60// CHECK-NEXT: Size: [[FINI_SIZE:.*]]
61
62// CHECK:      Relocations [
63// CHECK-NEXT: ]
64
65// CHECK:        Name: __fini_array_end
66// CHECK-NEXT:   Value: 0x1201B
67// CHECK-NEXT:   Size: 0
68// CHECK-NEXT:   Binding: Local
69// CHECK-NEXT:   Type: None
70// CHECK-NEXT:   Other: 0
71// CHECK-NEXT:   Section: .fini_array
72// CHECK-NEXT: }
73// CHECK-NEXT: Symbol {
74// CHECK-NEXT:   Name: __fini_array_start
75// CHECK-NEXT:   Value: [[FINI_ADDR]]
76// CHECK-NEXT:   Size: 0
77// CHECK-NEXT:   Binding: Local
78// CHECK-NEXT:   Type: None
79// CHECK-NEXT:   Other: 0
80// CHECK-NEXT:   Section: .fini_array
81// CHECK-NEXT: }
82// CHECK-NEXT: Symbol {
83// CHECK-NEXT:   Name: __init_array_end
84// CHECK-NEXT:   Value: 0x12008
85// CHECK-NEXT:   Size: 0
86// CHECK-NEXT:   Binding: Local
87// CHECK-NEXT:   Type: None
88// CHECK-NEXT:   Other: 0
89// CHECK-NEXT:   Section: .init_array
90// CHECK-NEXT: }
91// CHECK-NEXT: Symbol {
92// CHECK-NEXT:   Name: __init_array_start
93// CHECK-NEXT:   Value: [[INIT_ADDR]]
94// CHECK-NEXT:   Size: 0
95// CHECK-NEXT:   Binding: Local
96// CHECK-NEXT:   Type: None
97// CHECK-NEXT:   Other: 0
98// CHECK-NEXT:   Section: .init_array
99// CHECK-NEXT: }
100// CHECK-NEXT: Symbol {
101// CHECK-NEXT:   Name: __preinit_array_end
102// CHECK-NEXT:   Value: 0x12011
103// CHECK-NEXT:   Size: 0
104// CHECK-NEXT:   Binding: Local
105// CHECK-NEXT:   Type: None
106// CHECK-NEXT:   Other: 0
107// CHECK-NEXT:   Section: .preinit_array
108// CHECK-NEXT: }
109// CHECK-NEXT: Symbol {
110// CHECK-NEXT:   Name: __preinit_array_start
111// CHECK-NEXT:   Value: [[PREINIT_ADDR]]
112// CHECK-NEXT:   Size: 0
113// CHECK-NEXT:   Binding: Local
114// CHECK-NEXT:   Type: None
115// CHECK-NEXT:   Other: 0
116// CHECK-NEXT:   Section: .preinit_array
117// CHECK-NEXT: }
118
119// CHECK: DynamicSection
120// CHECK: PREINIT_ARRAY        [[PREINIT_ADDR]]
121// CHECK: PREINIT_ARRAYSZ      [[PREINIT_SIZE]] (bytes)
122// CHECK: INIT_ARRAY           [[INIT_ADDR]]
123// CHECK: INIT_ARRAYSZ         [[INIT_SIZE]] (bytes)
124// CHECK: FINI_ARRAY           [[FINI_ADDR]]
125// CHECK: FINI_ARRAYSZ         [[FINI_SIZE]] (bytes)
126
127
128// 0x12008 - (0x11000 + 5) = 4099
129// 0x12011 - (0x11005 + 5) = 4103
130// 0x12000 - (0x1100a + 5) = 4081
131// 0x12008 - (0x1100f + 5) = 4084
132// 0x12011 - (0x11014 + 5) = 4088
133// 0x1201B - (0x11019 + 5) = 4093
134// DISASM:      _start:
135// DISASM-NEXT:   11000:  e8 {{.*}}  callq  4099
136// DISASM-NEXT:   11005:  e8 {{.*}}  callq  4103
137// DISASM-NEXT:   1100a:  e8 {{.*}}  callq  4081
138// DISASM-NEXT:   1100f:  e8 {{.*}}  callq  4084
139// DISASM-NEXT:   11014:  e8 {{.*}}  callq  4088
140// DISASM-NEXT:   11019:  e8 {{.*}}  callq  4093
141