xref: /llvm-project-15.0.7/lld/test/ELF/shared.s (revision bacf751a)
1// REQUIRES: x86
2// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o
3// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o
4// RUN: ld.lld --hash-style=sysv -shared %t2.o -o %t2.so
5// RUN: llvm-readobj -s %t2.so | FileCheck --check-prefix=SO %s
6// RUN: ld.lld --hash-style=sysv -dynamic-linker /lib64/ld-linux-x86-64.so.2 -rpath foo -rpath bar --export-dynamic %t.o %t2.so -o %t
7// RUN: llvm-readobj --program-headers --dynamic-table -t -s -dyn-symbols -section-data -hash-table %t | FileCheck %s
8// RUN: ld.lld --hash-style=sysv %t.o %t2.so %t2.so -o %t2
9// RUN: llvm-readobj -dyn-symbols %t2 | FileCheck --check-prefix=DONT_EXPORT %s
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// CHECK:      Section {
77// CHECK-NEXT:   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
91// CHECK:      Name: .rel.dyn
92// CHECK-NEXT: Type: SHT_REL
93// CHECK-NEXT: Flags [
94// CHECK-NEXT:   SHF_ALLOC
95// CHECK-NEXT: ]
96// CHECK-NEXT: Address: [[RELADDR:.*]]
97// CHECK-NEXT: Offset:
98// CHECK-NEXT: Size: [[RELSIZE:.*]]
99// CHECK-NEXT: Link:
100// CHECK-NEXT: Info:
101// CHECK-NEXT: AddressAlignment:
102// CHECK-NEXT: EntrySize: [[RELENT:.*]]
103
104// CHECK:        Name: .dynamic
105// CHECK-NEXT:   Type: SHT_DYNAMIC
106// CHECK-NEXT:   Flags [
107// CHECK-NEXT:     SHF_ALLOC
108// CHECK-NEXT:     SHF_WRITE
109// CHECK-NEXT:   ]
110// CHECK-NEXT:   Address: [[ADDR:.*]]
111// CHECK-NEXT:   Offset: [[OFFSET:.*]]
112// CHECK-NEXT:   Size: [[SIZE:.*]]
113// CHECK-NEXT:   Link: [[DYNSTR]]
114// CHECK-NEXT:   Info: 0
115// CHECK-NEXT:   AddressAlignment: [[ALIGN:.*]]
116// CHECK-NEXT:   EntrySize: 8
117// CHECK-NEXT:   SectionData (
118// CHECK:        )
119
120// CHECK:      Name: .symtab
121// CHECK-NEXT: Type: SHT_SYMTAB
122// CHECK-NEXT: Flags [
123// CHECK-NEXT: ]
124// CHECK-NEXT: Address:
125// CHECK-NEXT: Offset:
126// CHECK-NEXT: Size:
127// CHECK-NEXT: Link:
128// CHECK-NEXT: Info:
129// CHECK-NEXT: AddressAlignment:
130// CHECK-NEXT: EntrySize: [[SYMENT:.*]]
131
132// CHECK:      Symbols [
133// CHECK-NEXT:   Symbol {
134// CHECK-NEXT:     Name:
135// CHECK-NEXT:     Value: 0x0
136// CHECK-NEXT:     Size: 0
137// CHECK-NEXT:     Binding: Local
138// CHECK-NEXT:     Type: None
139// CHECK-NEXT:     Other: 0
140// CHECK-NEXT:     Section: Undefined
141// CHECK-NEXT:   }
142// CHECK-NEXT:   Symbol {
143// CHECK-NEXT:     Name: _DYNAMIC
144// CHECK-NEXT:     Value: 0x402000
145// CHECK-NEXT:     Size: 0
146// CHECK-NEXT:     Binding: Local
147// CHECK-NEXT:     Type: None
148// CHECK-NEXT:     Other [ (0x2)
149// CHECK-NEXT:       STV_HIDDEN
150// CHECK-NEXT:     ]
151// CHECK-NEXT:     Section: .dynamic
152// CHECK-NEXT:   }
153// CHECK-NEXT:   Symbol {
154// CHECK-NEXT:     Name: _start
155// CHECK-NEXT:     Value: 0x401000
156// CHECK-NEXT:     Size: 0
157// CHECK-NEXT:     Binding: Global
158// CHECK-NEXT:     Type: None
159// CHECK-NEXT:     Other: 0
160// CHECK-NEXT:     Section: .text
161// CHECK-NEXT:   }
162// CHECK-NEXT:   Symbol {
163// CHECK-NEXT:     Name: bar
164// CHECK-NEXT:     Value: 0x0
165// CHECK-NEXT:     Size: 0
166// CHECK-NEXT:     Binding: Global
167// CHECK-NEXT:     Type: Function
168// CHECK-NEXT:     Other: 0
169// CHECK-NEXT:     Section: Undefined
170// CHECK-NEXT:   }
171// CHECK-NEXT:   Symbol {
172// CHECK-NEXT:     Name: zed
173// CHECK-NEXT:     Value: 0x0
174// CHECK-NEXT:     Size: 0
175// CHECK-NEXT:     Binding: Global (0x1)
176// CHECK-NEXT:     Type: None (0x0)
177// CHECK-NEXT:     Other: 0
178// CHECK-NEXT:     Section: Undefined (0x0)
179// CHECK-NEXT:   }
180// CHECK-NEXT: ]
181
182// CHECK:      DynamicSymbols [
183// CHECK-NEXT:   Symbol {
184// CHECK-NEXT:     Name: @
185// CHECK-NEXT:     Value: 0x0
186// CHECK-NEXT:     Size: 0
187// CHECK-NEXT:     Binding: Local
188// CHECK-NEXT:     Type: None
189// CHECK-NEXT:     Other: 0
190// CHECK-NEXT:     Section: Undefined
191// CHECK-NEXT:   }
192// CHECK-NEXT:   Symbol {
193// CHECK-NEXT:     Name: _start@
194// CHECK-NEXT:     Value: 0x401000
195// CHECK-NEXT:     Size: 0
196// CHECK-NEXT:     Binding: Global
197// CHECK-NEXT:     Type: Non
198// CHECK-NEXT:     Other: 0
199// CHECK-NEXT:     Section: .text
200// CHECK-NEXT:   }
201// CHECK-NEXT:   Symbol {
202// CHECK-NEXT:     Name: bar@
203// CHECK-NEXT:     Value: 0x0
204// CHECK-NEXT:     Size: 0
205// CHECK-NEXT:     Binding: Global
206// CHECK-NEXT:     Type: Function
207// CHECK-NEXT:     Other: 0
208// CHECK-NEXT:     Section: Undefined
209// CHECK-NEXT:   }
210// CHECK-NEXT:   Symbol {
211// CHECK-NEXT:     Name: zed@
212// CHECK-NEXT:     Value: 0x0
213// CHECK-NEXT:     Size: 0
214// CHECK-NEXT:     Binding: Global
215// CHECK-NEXT:     Type: None
216// CHECK-NEXT:     Other: 0
217// CHECK-NEXT:     Section: Undefined
218// CHECK-NEXT:   }
219// CHECK-NEXT: ]
220
221// DONT_EXPORT:      DynamicSymbols [
222// DONT_EXPORT-NEXT:   Symbol {
223// DONT_EXPORT-NEXT:     Name: @
224// DONT_EXPORT-NEXT:     Value: 0x0
225// DONT_EXPORT-NEXT:     Size: 0
226// DONT_EXPORT-NEXT:     Binding: Local (0x0)
227// DONT_EXPORT-NEXT:     Type: None (0x0)
228// DONT_EXPORT-NEXT:     Other: 0
229// DONT_EXPORT-NEXT:     Section: Undefined (0x0)
230// DONT_EXPORT-NEXT:   }
231// DONT_EXPORT-NEXT:   Symbol {
232// DONT_EXPORT-NEXT:     Name: bar@
233// DONT_EXPORT-NEXT:     Value: 0x0
234// DONT_EXPORT-NEXT:     Size: 0
235// DONT_EXPORT-NEXT:     Binding: Global
236// DONT_EXPORT-NEXT:     Type: Function
237// DONT_EXPORT-NEXT:     Other: 0
238// DONT_EXPORT-NEXT:     Section: Undefined
239// DONT_EXPORT-NEXT:   }
240// DONT_EXPORT-NEXT:   Symbol {
241// DONT_EXPORT-NEXT:     Name: zed@
242// DONT_EXPORT-NEXT:     Value: 0x0
243// DONT_EXPORT-NEXT:     Size: 0
244// DONT_EXPORT-NEXT:     Binding: Global
245// DONT_EXPORT-NEXT:     Type: None
246// DONT_EXPORT-NEXT:     Other: 0
247// DONT_EXPORT-NEXT:     Section: Undefined
248// DONT_EXPORT-NEXT:   }
249// DONT_EXPORT-NEXT: ]
250
251// CHECK:      DynamicSection [
252// CHECK-NEXT:   Tag        Type                 Name/Value
253// CHECK-NEXT:   0x0000001D RUNPATH              foo:bar
254// CHECK-NEXT:   0x00000001 NEEDED               Shared library: [{{.*}}2.so]
255// CHECK-NEXT:   0x00000015 DEBUG                0x0
256// CHECK-NEXT:   0x00000011 REL                  [[RELADDR]]
257// CHECK-NEXT:   0x00000012 RELSZ                [[RELSIZE]] (bytes)
258// CHECK-NEXT:   0x00000013 RELENT               [[RELENT]] (bytes)
259// CHECK-NEXT:   0x00000006 SYMTAB               [[DYNSYMADDR]]
260// CHECK-NEXT:   0x0000000B SYMENT               [[SYMENT]] (bytes)
261// CHECK-NEXT:   0x00000005 STRTAB               [[DYNSTRADDR]]
262// CHECK-NEXT:   0x0000000A STRSZ
263// CHECK-NEXT:   0x00000004 HASH                 [[HASHADDR]]
264// CHECK-NEXT:   0x00000000 NULL                 0x0
265// CHECK-NEXT: ]
266
267// CHECK:     ProgramHeaders [
268// CHECK:        Type: PT_INTERP
269// CHECK-NEXT:   Offset: [[INTERPOFFSET]]
270// CHECK-NEXT:   VirtualAddress: [[INTERPADDR]]
271// CHECK-NEXT:   PhysicalAddress: [[INTERPADDR]]
272// CHECK-NEXT:   FileSize: [[INTERPSIZE]]
273// CHECK-NEXT:   MemSize: [[INTERPSIZE]]
274// CHECK-NEXT:   Flags [
275// CHECK-NEXT:     PF_R
276// CHECK-NEXT:   ]
277// CHECK-NEXT:   Alignment: 1
278// CHECK-NEXT: }
279// CHECK:        Type: PT_DYNAMIC
280// CHECK-NEXT:   Offset: [[OFFSET]]
281// CHECK-NEXT:   VirtualAddress: [[ADDR]]
282// CHECK-NEXT:   PhysicalAddress: [[ADDR]]
283// CHECK-NEXT:   FileSize: [[SIZE]]
284// CHECK-NEXT:   MemSize: [[SIZE]]
285// CHECK-NEXT:   Flags [
286// CHECK-NEXT:     PF_R
287// CHECK-NEXT:     PF_W
288// CHECK-NEXT:   ]
289// CHECK-NEXT:   Alignment: [[ALIGN]]
290// CHECK-NEXT: }
291
292// CHECK:      HashTable {
293// CHECK-NEXT:   Num Buckets: 4
294// CHECK-NEXT:   Num Chains: 4
295// CHECK-NEXT:   Buckets: [3, 0, 2, 0]
296// CHECK-NEXT:   Chains: [0, 0, 0, 1]
297// CHECK-NEXT: }
298
299.global _start
300_start:
301.long bar@GOT
302.long zed@GOT
303