xref: /llvm-project-15.0.7/lld/test/ELF/shared.s (revision 052d95a6)
1// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o
2// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o
3// RUN: ld.lld -shared %t2.o -o %t2.so
4// RUN: llvm-readobj -s %t2.so | FileCheck --check-prefix=SO %s
5// RUN: ld.lld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -rpath foo -rpath bar --export-dynamic %t.o %t2.so -o %t
6// RUN: llvm-readobj --program-headers --dynamic-table -t -s -dyn-symbols -section-data -hash-table %t | FileCheck %s
7// RUN: ld.lld %t.o %t2.so %t2.so -o %t2
8// RUN: llvm-readobj -dyn-symbols %t2 | FileCheck --check-prefix=DONT_EXPORT %s
9// REQUIRES: x86
10
11// Make sure .symtab is properly aligned.
12// SO:      Name: .symtab
13// SO-NEXT: Type: SHT_SYMTAB
14// SO-NEXT: Flags [
15// SO-NEXT: ]
16// SO-NEXT: Address:
17// SO-NEXT: Offset: 0x1038
18// SO-NEXT: Size:
19// SO-NEXT: Link:
20// SO-NEXT: Info:
21// SO-NEXT: AddressAlignment: 4
22
23// CHECK:        Name: .interp
24// CHECK-NEXT:   Type: SHT_PROGBITS
25// CHECK-NEXT:   Flags [
26// CHECK-NEXT:     SHF_ALLOC
27// CHECK-NEXT:   ]
28// CHECK-NEXT:   Address: [[INTERPADDR:.*]]
29// CHECK-NEXT:   Offset: [[INTERPOFFSET:.*]]
30// CHECK-NEXT:   Size: [[INTERPSIZE:.*]]
31// CHECK-NEXT:   Link: 0
32// CHECK-NEXT:   Info: 0
33// CHECK-NEXT:   AddressAlignment: 1
34// CHECK-NEXT:   EntrySize: 0
35// CHECK-NEXT:   SectionData (
36// CHECK-NEXT:     0000: 2F6C6962 36342F6C 642D6C69 6E75782D  |/lib64/ld-linux-|
37// CHECK-NEXT:     0010: 7838362D 36342E73 6F2E3200           |x86-64.so.2.|
38// CHECK-NEXT:   )
39// CHECK-NEXT: }
40
41// test that .hash is linked to .dynsym
42// CHECK:        Index: 2
43// CHECK-NEXT:   Name: .dynsym
44// CHECK-NEXT:   Type: SHT_DYNSYM
45// CHECK-NEXT:   Flags [
46// CHECK-NEXT:     SHF_ALLOC
47// CHECK-NEXT:   ]
48// CHECK-NEXT:   Address: [[DYNSYMADDR:.*]]
49// CHECK-NEXT:   Offset: 0x150
50// CHECK-NEXT:   Size:
51// CHECK-NEXT:   Link: [[DYNSTR:.*]]
52// CHECK-NEXT:   Info: 1
53// CHECK-NEXT:   AddressAlignment: 4
54// CHECK-NEXT:   EntrySize: 16
55// CHECK-NEXT:   SectionData (
56// CHECK-NEXT:     0000:
57// CHECK-NEXT:     0010:
58// CHECK-NEXT:     0020:
59// CHECK-NEXT:     0030:
60// CHECK-NEXT:   )
61// CHECK-NEXT: }
62// CHECK-NEXT: Section {
63// CHECK-NEXT:   Index: 3
64// CHECK-NEXT:    Name: .hash
65// CHECK-NEXT:    Type: SHT_HASH
66// CHECK-NEXT:    Flags [
67// CHECK-NEXT:      SHF_ALLOC
68// CHECK-NEXT:    ]
69// CHECK-NEXT:    Address: [[HASHADDR:.*]]
70// CHECK-NEXT:    Offset:
71// CHECK-NEXT:    Size:
72// CHECK-NEXT:    Link: 2
73// CHECK-NEXT:    Info: 0
74// CHECK-NEXT:    AddressAlignment: 4
75// CHECK-NEXT:    EntrySize: 4
76
77// CHECK:        Index: [[DYNSTR]]
78// CHECK-NEXT:   Name: .dynstr
79// CHECK-NEXT:   Type: SHT_STRTAB
80// CHECK-NEXT:   Flags [
81// CHECK-NEXT:     SHF_ALLOC
82// CHECK-NEXT:   ]
83// CHECK-NEXT:   Address: [[DYNSTRADDR:.*]]
84// CHECK-NEXT:   Offset:
85// CHECK-NEXT:   Size:
86// CHECK-NEXT:   Link: 0
87// CHECK-NEXT:   Info: 0
88// CHECK-NEXT:   AddressAlignment: 1
89// CHECK-NEXT:   EntrySize: 0
90// CHECK-NEXT:   SectionData (
91// CHECK:        )
92// CHECK-NEXT: }
93
94// CHECK:      Name: .rel.dyn
95// CHECK-NEXT: Type: SHT_REL
96// CHECK-NEXT: Flags [
97// CHECK-NEXT:   SHF_ALLOC
98// CHECK-NEXT: ]
99// CHECK-NEXT: Address: [[RELADDR:.*]]
100// CHECK-NEXT: Offset:
101// CHECK-NEXT: Size: [[RELSIZE:.*]]
102// CHECK-NEXT: Link:
103// CHECK-NEXT: Info:
104// CHECK-NEXT: AddressAlignment:
105// CHECK-NEXT: EntrySize: [[RELENT:.*]]
106
107// CHECK:        Name: .dynamic
108// CHECK-NEXT:   Type: SHT_DYNAMIC
109// CHECK-NEXT:   Flags [
110// CHECK-NEXT:     SHF_ALLOC
111// CHECK-NEXT:     SHF_WRITE
112// CHECK-NEXT:   ]
113// CHECK-NEXT:   Address: [[ADDR:.*]]
114// CHECK-NEXT:   Offset: [[OFFSET:.*]]
115// CHECK-NEXT:   Size: [[SIZE:.*]]
116// CHECK-NEXT:   Link: [[DYNSTR]]
117// CHECK-NEXT:   Info: 0
118// CHECK-NEXT:   AddressAlignment: [[ALIGN:.*]]
119// CHECK-NEXT:   EntrySize: 8
120// CHECK-NEXT:   SectionData (
121// CHECK:        )
122
123// CHECK:      Name: .symtab
124// CHECK-NEXT: Type: SHT_SYMTAB
125// CHECK-NEXT: Flags [
126// CHECK-NEXT: ]
127// CHECK-NEXT: Address:
128// CHECK-NEXT: Offset:
129// CHECK-NEXT: Size:
130// CHECK-NEXT: Link:
131// CHECK-NEXT: Info:
132// CHECK-NEXT: AddressAlignment:
133// CHECK-NEXT: EntrySize: [[SYMENT:.*]]
134
135// CHECK:      Symbols [
136// CHECK-NEXT:   Symbol {
137// CHECK-NEXT:     Name:
138// CHECK-NEXT:     Value: 0x0
139// CHECK-NEXT:     Size: 0
140// CHECK-NEXT:     Binding: Local
141// CHECK-NEXT:     Type: None
142// CHECK-NEXT:     Other: 0
143// CHECK-NEXT:     Section: Undefined
144// CHECK-NEXT:   }
145// CHECK-NEXT:   Symbol {
146// CHECK-NEXT:     Name: _DYNAMIC
147// CHECK-NEXT:     Value: 0x12000
148// CHECK-NEXT:     Size: 0
149// CHECK-NEXT:     Binding: Local
150// CHECK-NEXT:     Type: None
151// CHECK-NEXT:     Other [ (0x2)
152// CHECK-NEXT:       STV_HIDDEN
153// CHECK-NEXT:     ]
154// CHECK-NEXT:     Section: .dynamic
155// CHECK-NEXT:   }
156// CHECK-NEXT:   Symbol {
157// CHECK-NEXT:     Name: _start
158// CHECK-NEXT:     Value: 0x11000
159// CHECK-NEXT:     Size: 0
160// CHECK-NEXT:     Binding: Global
161// CHECK-NEXT:     Type: None
162// CHECK-NEXT:     Other: 0
163// CHECK-NEXT:     Section: .text
164// CHECK-NEXT:   }
165// CHECK-NEXT:   Symbol {
166// CHECK-NEXT:     Name: bar
167// CHECK-NEXT:     Value: 0x0
168// CHECK-NEXT:     Size: 0
169// CHECK-NEXT:     Binding: Global
170// CHECK-NEXT:     Type: Function
171// CHECK-NEXT:     Other: 0
172// CHECK-NEXT:     Section: Undefined
173// CHECK-NEXT:   }
174// CHECK-NEXT:   Symbol {
175// CHECK-NEXT:     Name: zed
176// CHECK-NEXT:     Value: 0x0
177// CHECK-NEXT:     Size: 0
178// CHECK-NEXT:     Binding: Global (0x1)
179// CHECK-NEXT:     Type: None (0x0)
180// CHECK-NEXT:     Other: 0
181// CHECK-NEXT:     Section: Undefined (0x0)
182// CHECK-NEXT:   }
183// CHECK-NEXT: ]
184
185// CHECK:      DynamicSymbols [
186// CHECK-NEXT:   Symbol {
187// CHECK-NEXT:     Name: @
188// CHECK-NEXT:     Value: 0x0
189// CHECK-NEXT:     Size: 0
190// CHECK-NEXT:     Binding: Local
191// CHECK-NEXT:     Type: None
192// CHECK-NEXT:     Other: 0
193// CHECK-NEXT:     Section: Undefined
194// CHECK-NEXT:   }
195// CHECK-NEXT:   Symbol {
196// CHECK-NEXT:     Name: _start@
197// CHECK-NEXT:     Value: 0x11000
198// CHECK-NEXT:     Size: 0
199// CHECK-NEXT:     Binding: Global
200// CHECK-NEXT:     Type: Non
201// CHECK-NEXT:     Other: 0
202// CHECK-NEXT:     Section: .text
203// CHECK-NEXT:   }
204// CHECK-NEXT:   Symbol {
205// CHECK-NEXT:     Name: bar@
206// CHECK-NEXT:     Value: 0x0
207// CHECK-NEXT:     Size: 0
208// CHECK-NEXT:     Binding: Global
209// CHECK-NEXT:     Type: Function
210// CHECK-NEXT:     Other: 0
211// CHECK-NEXT:     Section: Undefined
212// CHECK-NEXT:   }
213// CHECK-NEXT:   Symbol {
214// CHECK-NEXT:     Name: zed@
215// CHECK-NEXT:     Value: 0x0
216// CHECK-NEXT:     Size: 0
217// CHECK-NEXT:     Binding: Global
218// CHECK-NEXT:     Type: None
219// CHECK-NEXT:     Other: 0
220// CHECK-NEXT:     Section: Undefined
221// CHECK-NEXT:   }
222// CHECK-NEXT: ]
223
224// DONT_EXPORT:      DynamicSymbols [
225// DONT_EXPORT-NEXT:   Symbol {
226// DONT_EXPORT-NEXT:     Name: @
227// DONT_EXPORT-NEXT:     Value: 0x0
228// DONT_EXPORT-NEXT:     Size: 0
229// DONT_EXPORT-NEXT:     Binding: Local (0x0)
230// DONT_EXPORT-NEXT:     Type: None (0x0)
231// DONT_EXPORT-NEXT:     Other: 0
232// DONT_EXPORT-NEXT:     Section: Undefined (0x0)
233// DONT_EXPORT-NEXT:   }
234// DONT_EXPORT-NEXT:   Symbol {
235// DONT_EXPORT-NEXT:     Name: bar@
236// DONT_EXPORT-NEXT:     Value: 0x0
237// DONT_EXPORT-NEXT:     Size: 0
238// DONT_EXPORT-NEXT:     Binding: Global
239// DONT_EXPORT-NEXT:     Type: Function
240// DONT_EXPORT-NEXT:     Other: 0
241// DONT_EXPORT-NEXT:     Section: Undefined
242// DONT_EXPORT-NEXT:   }
243// DONT_EXPORT-NEXT:   Symbol {
244// DONT_EXPORT-NEXT:     Name: zed@
245// DONT_EXPORT-NEXT:     Value: 0x0
246// DONT_EXPORT-NEXT:     Size: 0
247// DONT_EXPORT-NEXT:     Binding: Global
248// DONT_EXPORT-NEXT:     Type: None
249// DONT_EXPORT-NEXT:     Other: 0
250// DONT_EXPORT-NEXT:     Section: Undefined
251// DONT_EXPORT-NEXT:   }
252// DONT_EXPORT-NEXT: ]
253
254// CHECK:      DynamicSection [
255// CHECK-NEXT:   Tag        Type                 Name/Value
256// CHECK-NEXT:   0x0000001D RUNPATH              foo:bar
257// CHECK-NEXT:   0x00000001 NEEDED               SharedLibrary ({{.*}}2.so)
258// CHECK-NEXT:   0x00000015 DEBUG                0x0
259// CHECK-NEXT:   0x00000011 REL                  [[RELADDR]]
260// CHECK-NEXT:   0x00000012 RELSZ                [[RELSIZE]] (bytes)
261// CHECK-NEXT:   0x00000013 RELENT               [[RELENT]] (bytes)
262// CHECK-NEXT:   0x00000006 SYMTAB               [[DYNSYMADDR]]
263// CHECK-NEXT:   0x0000000B SYMENT               [[SYMENT]] (bytes)
264// CHECK-NEXT:   0x00000005 STRTAB               [[DYNSTRADDR]]
265// CHECK-NEXT:   0x0000000A STRSZ
266// CHECK-NEXT:   0x00000004 HASH                 [[HASHADDR]]
267// CHECK-NEXT:   0x00000000 NULL                 0x0
268// CHECK-NEXT: ]
269
270// CHECK:     ProgramHeaders [
271// CHECK:        Type: PT_INTERP
272// CHECK-NEXT:   Offset: [[INTERPOFFSET]]
273// CHECK-NEXT:   VirtualAddress: [[INTERPADDR]]
274// CHECK-NEXT:   PhysicalAddress: [[INTERPADDR]]
275// CHECK-NEXT:   FileSize: [[INTERPSIZE]]
276// CHECK-NEXT:   MemSize: [[INTERPSIZE]]
277// CHECK-NEXT:   Flags [
278// CHECK-NEXT:     PF_R
279// CHECK-NEXT:   ]
280// CHECK-NEXT:   Alignment: 1
281// CHECK-NEXT: }
282// CHECK:        Type: PT_DYNAMIC
283// CHECK-NEXT:   Offset: [[OFFSET]]
284// CHECK-NEXT:   VirtualAddress: [[ADDR]]
285// CHECK-NEXT:   PhysicalAddress: [[ADDR]]
286// CHECK-NEXT:   FileSize: [[SIZE]]
287// CHECK-NEXT:   MemSize: [[SIZE]]
288// CHECK-NEXT:   Flags [
289// CHECK-NEXT:     PF_R
290// CHECK-NEXT:     PF_W
291// CHECK-NEXT:   ]
292// CHECK-NEXT:   Alignment: [[ALIGN]]
293// CHECK-NEXT: }
294
295// CHECK:      HashTable {
296// CHECK-NEXT:   Num Buckets: 4
297// CHECK-NEXT:   Num Chains: 4
298// CHECK-NEXT:   Buckets: [3, 0, 2, 0]
299// CHECK-NEXT:   Chains: [0, 0, 0, 1]
300// CHECK-NEXT: }
301
302.global _start
303_start:
304.long bar@GOT
305.long zed@GOT
306