xref: /llvm-project-15.0.7/lld/test/ELF/shared.s (revision fcef3e46)
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: 0x1030
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// CHECK-NEXT: }
123
124// CHECK:      Name: .symtab
125// CHECK-NEXT: Type: SHT_SYMTAB
126// CHECK-NEXT: Flags [
127// CHECK-NEXT: ]
128// CHECK-NEXT: Address:
129// CHECK-NEXT: Offset:
130// CHECK-NEXT: Size:
131// CHECK-NEXT: Link:
132// CHECK-NEXT: Info:
133// CHECK-NEXT: AddressAlignment:
134// CHECK-NEXT: EntrySize: [[SYMENT:.*]]
135
136// CHECK:      Symbols [
137// CHECK-NEXT:   Symbol {
138// CHECK-NEXT:     Name:
139// CHECK-NEXT:     Value: 0x0
140// CHECK-NEXT:     Size: 0
141// CHECK-NEXT:     Binding: Local
142// CHECK-NEXT:     Type: None
143// CHECK-NEXT:     Other: 0
144// CHECK-NEXT:     Section: Undefined
145// CHECK-NEXT:   }
146// CHECK-NEXT:   Symbol {
147// CHECK-NEXT:     Name: _DYNAMIC
148// CHECK-NEXT:     Value: 0x12000
149// CHECK-NEXT:     Size: 0
150// CHECK-NEXT:     Binding: Local
151// CHECK-NEXT:     Type: None
152// CHECK-NEXT:     Other [ (0x2)
153// CHECK-NEXT:       STV_HIDDEN
154// CHECK-NEXT:     ]
155// CHECK-NEXT:     Section: .dynamic
156// CHECK-NEXT:   }
157// CHECK-NEXT:   Symbol {
158// CHECK-NEXT:     Name: _start
159// CHECK-NEXT:     Value: 0x11000
160// CHECK-NEXT:     Size: 0
161// CHECK-NEXT:     Binding: Global
162// CHECK-NEXT:     Type: None
163// CHECK-NEXT:     Other: 0
164// CHECK-NEXT:     Section: .text
165// CHECK-NEXT:   }
166// CHECK-NEXT:   Symbol {
167// CHECK-NEXT:     Name: bar
168// CHECK-NEXT:     Value: 0x0
169// CHECK-NEXT:     Size: 0
170// CHECK-NEXT:     Binding: Global
171// CHECK-NEXT:     Type: Function
172// CHECK-NEXT:     Other: 0
173// CHECK-NEXT:     Section: Undefined
174// CHECK-NEXT:   }
175// CHECK-NEXT:   Symbol {
176// CHECK-NEXT:     Name: zed
177// CHECK-NEXT:     Value: 0x0
178// CHECK-NEXT:     Size: 0
179// CHECK-NEXT:     Binding: Global (0x1)
180// CHECK-NEXT:     Type: None (0x0)
181// CHECK-NEXT:     Other: 0
182// CHECK-NEXT:     Section: Undefined (0x0)
183// CHECK-NEXT:   }
184// CHECK-NEXT: ]
185
186// CHECK:      DynamicSymbols [
187// CHECK-NEXT:   Symbol {
188// CHECK-NEXT:     Name: @ (0)
189// CHECK-NEXT:     Value: 0x0
190// CHECK-NEXT:     Size: 0
191// CHECK-NEXT:     Binding: Local
192// CHECK-NEXT:     Type: None
193// CHECK-NEXT:     Other: 0
194// CHECK-NEXT:     Section: Undefined
195// CHECK-NEXT:   }
196// CHECK-NEXT:   Symbol {
197// CHECK-NEXT:     Name: _start@
198// CHECK-NEXT:     Value: 0x11000
199// CHECK-NEXT:     Size: 0
200// CHECK-NEXT:     Binding: Global
201// CHECK-NEXT:     Type: Non
202// CHECK-NEXT:     Other: 0
203// CHECK-NEXT:     Section: .text
204// CHECK-NEXT:   }
205// CHECK-NEXT:   Symbol {
206// CHECK-NEXT:     Name: bar@
207// CHECK-NEXT:     Value: 0x0
208// CHECK-NEXT:     Size: 0
209// CHECK-NEXT:     Binding: Global
210// CHECK-NEXT:     Type: Function
211// CHECK-NEXT:     Other: 0
212// CHECK-NEXT:     Section: Undefined
213// CHECK-NEXT:   }
214// CHECK-NEXT:   Symbol {
215// CHECK-NEXT:     Name: zed@
216// CHECK-NEXT:     Value: 0x0
217// CHECK-NEXT:     Size: 0
218// CHECK-NEXT:     Binding: Global
219// CHECK-NEXT:     Type: None
220// CHECK-NEXT:     Other: 0
221// CHECK-NEXT:     Section: Undefined
222// CHECK-NEXT:   }
223// CHECK-NEXT: ]
224
225// DONT_EXPORT:      DynamicSymbols [
226// DONT_EXPORT-NEXT:   Symbol {
227// DONT_EXPORT-NEXT:     Name: @ (0)
228// DONT_EXPORT-NEXT:     Value: 0x0
229// DONT_EXPORT-NEXT:     Size: 0
230// DONT_EXPORT-NEXT:     Binding: Local (0x0)
231// DONT_EXPORT-NEXT:     Type: None (0x0)
232// DONT_EXPORT-NEXT:     Other: 0
233// DONT_EXPORT-NEXT:     Section: Undefined (0x0)
234// DONT_EXPORT-NEXT:   }
235// DONT_EXPORT-NEXT:   Symbol {
236// DONT_EXPORT-NEXT:     Name: bar@
237// DONT_EXPORT-NEXT:     Value: 0x0
238// DONT_EXPORT-NEXT:     Size: 0
239// DONT_EXPORT-NEXT:     Binding: Global
240// DONT_EXPORT-NEXT:     Type: Function
241// DONT_EXPORT-NEXT:     Other: 0
242// DONT_EXPORT-NEXT:     Section: Undefined
243// DONT_EXPORT-NEXT:   }
244// DONT_EXPORT-NEXT:   Symbol {
245// DONT_EXPORT-NEXT:     Name: zed@
246// DONT_EXPORT-NEXT:     Value: 0x0
247// DONT_EXPORT-NEXT:     Size: 0
248// DONT_EXPORT-NEXT:     Binding: Global
249// DONT_EXPORT-NEXT:     Type: None
250// DONT_EXPORT-NEXT:     Other: 0
251// DONT_EXPORT-NEXT:     Section: Undefined
252// DONT_EXPORT-NEXT:   }
253// DONT_EXPORT-NEXT: ]
254
255// CHECK:      DynamicSection [
256// CHECK-NEXT:   Tag        Type                 Name/Value
257// CHECK-NEXT:   0x0000001D RUNPATH              foo:bar
258// CHECK-NEXT:   0x00000001 NEEDED               SharedLibrary ({{.*}}2.so)
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:   0x00000015 DEBUG                0x0
268// CHECK-NEXT:   0x00000000 NULL                 0x0
269// CHECK-NEXT: ]
270
271// CHECK:     ProgramHeaders [
272// CHECK:        Type: PT_INTERP
273// CHECK-NEXT:   Offset: [[INTERPOFFSET]]
274// CHECK-NEXT:   VirtualAddress: [[INTERPADDR]]
275// CHECK-NEXT:   PhysicalAddress: [[INTERPADDR]]
276// CHECK-NEXT:   FileSize: [[INTERPSIZE]]
277// CHECK-NEXT:   MemSize: [[INTERPSIZE]]
278// CHECK-NEXT:   Flags [
279// CHECK-NEXT:     PF_R
280// CHECK-NEXT:   ]
281// CHECK-NEXT:   Alignment: 1
282// CHECK-NEXT: }
283// CHECK:        Type: PT_DYNAMIC
284// CHECK-NEXT:   Offset: [[OFFSET]]
285// CHECK-NEXT:   VirtualAddress: [[ADDR]]
286// CHECK-NEXT:   PhysicalAddress: [[ADDR]]
287// CHECK-NEXT:   FileSize: [[SIZE]]
288// CHECK-NEXT:   MemSize: [[SIZE]]
289// CHECK-NEXT:   Flags [
290// CHECK-NEXT:     PF_R
291// CHECK-NEXT:     PF_W
292// CHECK-NEXT:   ]
293// CHECK-NEXT:   Alignment: [[ALIGN]]
294// CHECK-NEXT: }
295
296// CHECK:      HashTable {
297// CHECK-NEXT:   Num Buckets: 4
298// CHECK-NEXT:   Num Chains: 4
299// CHECK-NEXT:   Buckets: [3, 0, 2, 0]
300// CHECK-NEXT:   Chains: [0, 0, 0, 1]
301// CHECK-NEXT: }
302
303.global _start
304_start:
305.long bar@GOT
306.long zed@GOT
307