1 // Test that synthetic sections are created correctly for each partition.
5 // RUN
: llvm-mc
-filetype
=obj
-triple
=x86_64-pc-linux
%S
/Inputs
/verneed1.s
-o
%t1.o
6 // RUN
: echo
"v1 {}; v2 {}; v3 { global: f1; local: *; };" > %t1.script
7 // RUN
: ld.lld
-shared
%t1.o
--version-script
%t1.script
-o
%t1.so
-soname verneed1.so.0
-z separate-code
9 // RUN
: llvm-mc
%s
-o
%t.o
-filetype
=obj
--triple
=x86_64-unknown-linux
10 // RUN
: echo
"x1 { global: p0; }; x2 { global: p1; p1alias; };" > %t.script
11 // RUN
: ld.lld
%t.o
%t1.so
--version-script
%t.script
-o
%t --shared
--gc-sections
--eh-frame-hdr
-soname main.so
-z separate-code
13 // RUN
: llvm-objcopy
--extract-main-partition
%t %t0
14 // RUN
: llvm-objcopy
--extract-partition
=part1
%t %t1
16 // RUN
: llvm-readelf
--all
--unwind
%t0 | FileCheck
--check-prefixes
=CHECK
,PART0
%s
17 // RUN
: llvm-readelf
--all
--unwind
%t1 | FileCheck
--check-prefixes
=CHECK
,PART1
%s
19 // FIXME
: llvm-objcopy does
not preserve padding
(see pr42145
) so for now we
20 // check the combined output file.
21 // RUN
: od
-Ax
-x
%t | FileCheck
%s
-check-prefix
=FILL
23 // RUN
: llvm-objdump
-s
-j
.rodata -j .dynstr %t0 | FileCheck --check-prefix=PART-INDEX %s
25 // CHECK
: Section Headers
:
28 // CHECK-NEXT
: .dynsym DYNSYM {{0*}}[[DYNSYM_ADDR:[^ ]*]]
29 // CHECK-NEXT
: .gnu.version VERSYM {{0*}}[[VERSYM_ADDR:[^ ]*]]
30 // CHECK-NEXT
: .gnu.version_d VERDEF {{0*}}[[VERDEF_ADDR:[^ ]*]]
31 // CHECK-NEXT
: .gnu.version_r VERNEED {{0*}}[[VERNEED_ADDR:[^ ]*]]
32 // CHECK-NEXT
: .gnu.hash GNU_HASH {{0*}}[[GNU_HASH_ADDR:[^ ]*]]
33 // CHECK-NEXT
: .hash HASH {{0*}}[[HASH_ADDR:[^ ]*]]
34 // CHECK-NEXT
: .dynstr STRTAB {{0*}}[[DYNSTR_ADDR:[^ ]*]]
35 // CHECK-NEXT
: .rela.dyn RELA {{0*}}[[RELA_DYN_ADDR:[^ ]*]]
36 // PART0-NEXT
: .rela.plt RELA {{0*}}[[RELA_PLT_ADDR:[^ ]*]]
37 // CHECK-NEXT
: .eh_frame_hdr PROGBITS {{0*}}[[EH_FRAME_HDR_ADDR:[^ ]*]]
38 // CHECK-NEXT
: .eh_frame PROGBITS {{0*}}[[EH_FRAME_ADDR:[^ ]*]]
39 // PART0-NEXT
: .rodata PROGBITS
40 // CHECK-NEXT
: .text PROGBITS {{0*}}[[TEXT_ADDR:[^ ]*]]
41 // PART0-NEXT
: .plt PROGBITS
42 // PART0-NEXT
: .init_array INIT_ARRAY {{0*}}[[INIT_ARRAY_ADDR:[^ ]*]]
43 // CHECK-NEXT
: .dynamic DYNAMIC {{0*}}[[DYNAMIC_ADDR:[^ ]*]]
44 // PART0-NEXT
: .data PROGBITS 000000000000[[DATA_SEGMENT:.]]178
45 // PART1-NEXT
: .data PROGBITS 000000000000[[DATA_SEGMENT:.]]130
46 // PART0-NEXT
: .got.plt PROGBITS {{0*}}[[GOT_PLT_ADDR:[^ ]*]]
47 // PART0-NEXT
: .part.end NOBITS {{0*}}[[PART_END_ADDR:[^ ]*]]
48 // CHECK-NEXT
: .comment PROGBITS
49 // CHECK-NEXT
: .symtab SYMTAB
50 // CHECK-NEXT
: .shstrtab STRTAB
51 // CHECK-NEXT
: .strtab STRTAB
52 // CHECK-NEXT
: Key to Flags
54 // CHECK
: Program Headers
:
56 // PART0-NEXT
: PHDR
{{.*}} 0x000230 0x000230 R
57 // PART1-NEXT
: PHDR
{{.*}} 0x0001f8 0x0001f8 R
58 // PART0-NEXT
: LOAD
0x000000 0x0000000000000000 0x0000000000000000 {{.*}} R 0x1000
59 // PART0-NEXT
: LOAD
0x001000 0x0000000000001000 0x0000000000001000 {{.*}} R E 0x1000
60 // PART0-NEXT
: LOAD
0x002000 0x0000000000002000 0x0000000000002000 {{.*}} RW 0x1000
61 // PART0-NEXT
: LOAD
0x002178 0x0000000000003178 0x0000000000003178 {{.*}} RW 0x1000
62 // PART0-NEXT
: LOAD
0x003150 0x0000000000008150 0x0000000000008150 0x000000 0x001000 RW
0x1000
63 // PART1-NEXT
: LOAD
0x000000 0x0000000000004000 0x0000000000004000 {{.*}} R 0x1000
64 // PART1-NEXT
: LOAD
0x001000 0x0000000000005000 0x0000000000005000 {{.*}} R E 0x1000
65 // PART1-NEXT
: LOAD
0x002000 0x0000000000006000 0x0000000000006000 {{.*}} RW 0x1000
66 // PART1-NEXT
: LOAD
0x002130 0x0000000000007130 0x0000000000007130 {{.*}} RW 0x1000
67 // CHECK-NEXT
: DYNAMIC
{{.*}} 0x{{0*}}[[DYNAMIC_ADDR]] 0x{{0*}}[[DYNAMIC_ADDR]] {{.*}} RW 0x8
68 // PART0-NEXT
: GNU_RELRO
0x002000 0x0000000000002000 0x0000000000002000 {{.*}} R 0x1
69 // PART1-NEXT
: GNU_RELRO
0x002000 0x0000000000006000 0x0000000000006000 {{.*}} R 0x1
70 // CHECK-NEXT
: GNU_EH_FRAME
{{.*}} 0x{{0*}}[[EH_FRAME_HDR_ADDR]] 0x{{0*}}[[EH_FRAME_HDR_ADDR]] {{.*}} R 0x4
71 // CHECK-NEXT
: GNU_STACK
0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW
0x0
74 // CHECK
: Dynamic section
76 // CHECK-NEXT
: 0x0000000000000001 (NEEDED
) Shared library
: [verneed1.so.0
]
77 // PART0-NEXT
: 0x000000000000000e (SONAME
) Library soname
: [main.so
]
78 // PART1-NEXT
: 0x0000000000000001 (NEEDED
) Shared library
: [main.so
]
79 // PART1-NEXT
: 0x000000000000000e (SONAME
) Library soname
: [part1
]
80 // CHECK-NEXT
: 0x0000000000000007 (RELA
) 0x
[[RELA_DYN_ADDR
]]
81 // CHECK-NEXT
: 0x0000000000000008 (RELASZ
)
82 // CHECK-NEXT
: 0x0000000000000009 (RELAENT
) 24 (bytes
)
83 // PART1-NEXT
: 0x000000006ffffff9 (RELACOUNT
) 1
84 // PART0-NEXT
: 0x0000000000000017 (JMPREL
) 0x
[[RELA_PLT_ADDR
]]
85 // PART0-NEXT
: 0x0000000000000002 (PLTRELSZ
) 48 (bytes
)
86 // PART0-NEXT
: 0x0000000000000003 (PLTGOT
) 0x
[[GOT_PLT_ADDR
]]
87 // PART0-NEXT
: 0x0000000000000014 (PLTREL
) RELA
88 // CHECK-NEXT
: 0x0000000000000006 (SYMTAB
) 0x
[[DYNSYM_ADDR
]]
89 // CHECK-NEXT
: 0x000000000000000b (SYMENT
) 24 (bytes
)
90 // CHECK-NEXT
: 0x0000000000000005 (STRTAB
) 0x
[[DYNSTR_ADDR
]]
91 // CHECK-NEXT
: 0x000000000000000a (STRSZ
)
92 // CHECK-NEXT
: 0x000000006ffffef5 (GNU_HASH
) 0x
[[GNU_HASH_ADDR
]]
93 // CHECK-NEXT
: 0x0000000000000004 (HASH
) 0x
[[HASH_ADDR
]]
94 // PART0-NEXT
: 0x0000000000000019 (INIT_ARRAY
) 0x
[[INIT_ARRAY_ADDR
]]
95 // PART0-NEXT
: 0x000000000000001b (INIT_ARRAYSZ
) 8 (bytes
)
96 // CHECK-NEXT
: 0x000000006ffffff0 (VERSYM
) 0x
[[VERSYM_ADDR
]]
97 // CHECK-NEXT
: 0x000000006ffffffc (VERDEF
) 0x
[[VERDEF_ADDR
]]
98 // CHECK-NEXT
: 0x000000006ffffffd (VERDEFNUM
) 3
99 // CHECK-NEXT
: 0x000000006ffffffe (VERNEED
) 0x
[[VERNEED_ADDR
]]
100 // CHECK-NEXT
: 0x000000006fffffff (VERNEEDNUM
) 1
101 // PART0-NEXT
: 0x0000000000000000 (NULL
) 0x0
103 // CHECK
: Relocation section
'.rela.dyn'
104 // CHECK-NEXT
: Offset
105 // PART0-NEXT
: 000000000000[[DATA_SEGMENT
]]178 {{.*}} R_X86_64_64 {{.*}} f1@v3 + 0
106 // PART0-NEXT
: {{0*}}[[INIT_ARRAY_ADDR
]] {{.*}} R_X86_64_64 {{.*}} p0@@x1 + 0
107 // PART1-NEXT
: 000000000000[[DATA_SEGMENT
]]148 {{.*}} R_X86_64_RELATIVE 3178
108 // PART1-NEXT
: 000000000000[[DATA_SEGMENT
]]130 {{.*}} R_X86_64_64 {{.*}} f2@v2 + 0
109 // PART1-NEXT
: 000000000000[[DATA_SEGMENT
]]138 {{.*}} R_X86_64_64 {{.*}} p0@x1 + 0
110 // PART1-NEXT
: 000000000000[[DATA_SEGMENT
]]140 {{.*}} R_X86_64_64 {{.*}} p0@x1 + 0
112 // PART0
: Relocation section
'.rela.plt'
113 // PART0-NEXT
: Offset
114 // PART0-NEXT
: 000000000000[[DATA_SEGMENT
]]198 {{.*}} R_X86_64_JUMP_SLOT {{.*}} f1@v3 + 0
115 // PART0-NEXT
: 000000000000[[DATA_SEGMENT
]]1a0
{{.*}} R_X86_64_JUMP_SLOT {{.*}} f2@v2 + 0
117 // CHECK-NEXT
: EHFrameHeader
118 // CHECK
: Address
: 0x
[[EH_FRAME_HDR_ADDR
]]
119 // CHECK
: eh_frame_ptr
: 0x
[[EH_FRAME_ADDR
]]
120 // CHECK
: initial_location
: 0x
[[TEXT_ADDR
]]
121 // CHECK
: address
: 0x
[[FDE_ADDR
:.*]]
123 // CHECK
: .eh_frame section
124 // CHECK
: 0x
[[EH_FRAME_ADDR
]]] CIE length
=20
126 // CHECK
: 0x
[[FDE_ADDR
]]] FDE length
=20 cie
={{.}}0x[[EH_FRAME_ADDR]]
127 // CHECK-NEXT
: initial_location
: 0x
[[TEXT_ADDR
]]
129 // CHECK
: CIE length
=0
131 // CHECK
: Symbol table
'.dynsym'
132 // PART0
: 1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND
f1@v3
133 // PART0
: 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND
f2@v2
134 // PART0
: 3: {{0*}}[[TEXT_ADDR
]] 0 NOTYPE GLOBAL DEFAULT
{{.*}} p0@@x1
135 // PART1
: 1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND
f2@v2
136 // PART1
: 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND p0@x1
137 // PART1
: 3: {{0*}}[[TEXT_ADDR
]] 0 NOTYPE GLOBAL DEFAULT
{{.*}} p1@@x2
138 // PART1
: 4: {{0*}}[[TEXT_ADDR
]] 0 NOTYPE GLOBAL DEFAULT
{{.*}} p1alias@@x2
141 // PART0
: Symbol table
'.symtab'
142 // PART0
: 000000000000048c
0 NOTYPE LOCAL HIDDEN
{{.*}} __part_index_begin
143 // PART0
: 0000000000000498 0 NOTYPE LOCAL HIDDEN
{{.*}} __part_index_end
145 // PART-INDEX
: Contents of section
.dynstr:
146 // PART-INDEX-NEXT
: 03a8
00703000 66310066 32007061 72743100 .p0.f1.f2.part1.
147 // PART-INDEX
: Contents of section
.rodata:
148 // 0x48c + 0xffffff26 = 0x3b2
149 // 0x490 + 0x3b70 = 0x4000
150 // PART-INDEX-NEXT
: 048c
26ffffff
703b0000
50410000
152 // CHECK
: Version symbols section
'.gnu.version'
154 // PART0-NEXT
: 000: 0 (*local
*) 4 (v3
) 5 (v2
) 2 (x1
)
155 // PART1-NEXT
: 000: 0 (*local
*) 5 (v2
) 2 (x1
) 3 (x2
)
157 // CHECK
: Version definition section
'.gnu.version_d'
159 // PART0-NEXT
: 0x0000: Rev
: 1 Flags
: BASE Index
: 1 Cnt
: 1 Name
: main.so
160 // PART1-NEXT
: 0x0000: Rev
: 1 Flags
: BASE Index
: 1 Cnt
: 1 Name
: part1
161 // CHECK-NEXT
: 0x001c: Rev
: 1 Flags
: none Index
: 2 Cnt
: 1 Name
: x1
162 // CHECK-NEXT
: 0x0038: Rev
: 1 Flags
: none Index
: 3 Cnt
: 1 Name
: x2
164 // CHECK
: Version needs section
'.gnu.version_r'
166 // CHECK-NEXT
: 0x0000: Version
: 1 File
: verneed1.so.0 Cnt
: 2
167 // CHECK-NEXT
: 0x0010: Name
: v2 Flags
: none Version
: 5
168 // CHECK-NEXT
: 0x0020: Name
: v3 Flags
: none Version
: 4
170 // PART0
: Histogram for bucket list length
(total of
4 buckets
)
171 // PART0-NEXT
: Length Number
% of total Coverage
172 // PART0-NEXT
: 0 1 ( 25.0%) 0.0%
173 // PART0-NEXT
: 1 3 ( 75.0%) 100.0%
174 // PART0-NEXT
: Histogram for `
.gnu.hash' bucket list length (total of 1 buckets)
175 // PART0-NEXT: Length Number % of total Coverage
176 // PART0-NEXT: 0 0 ( 0.0%) 0.0%
177 // PART0-NEXT: 1 1 (100.0%) 100.0%
179 // PART1: Histogram for bucket list length (total of 5 buckets)
180 // PART1-NEXT: Length Number % of total Coverage
181 // PART1-NEXT: 0 3 ( 60.0%) 0.0%
182 // PART1-NEXT: 1 2 ( 40.0%) 100.0%
183 // PART1-NEXT: Histogram for `.gnu.hash' bucket list length (total of 1 buckets)
184 // PART1-NEXT
: Length Number
% of total Coverage
185 // PART1-NEXT
: 0 0 ( 0.0%) 0.0%
186 // PART1-NEXT
: 1 0 ( 0.0%) 0.0%
187 // PART1-NEXT
: 2 1 (100.0%) 100.0%
189 // FILL
: 001040 cccc cccc cccc cccc cccc cccc cccc cccc
193 // FILL
: 004010 cccc cccc cccc cccc cccc cccc cccc cccc
197 .section .llvm_sympart,"",@llvm_sympart
201 .section .llvm_sympart2,"",@llvm_sympart
205 .section .text.p0,"ax",@progbits
214 .section .data.d0,"aw",@progbits
218 .section .text.p1,"ax",@progbits
229 .section .data.d1,"aw",@progbits
236 .section .init_array,"aw",@init_array
239 .globl __part_index_begin
240 .globl __part_index_end