1# REQUIRES: x86
2
3# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/verdef-defaultver.s -o %t1
4# RUN: echo "V1 { global: a; local: *; };" > %t.script
5# RUN: echo "V2 { global: b; c; } V1;" >> %t.script
6# RUN: ld.lld --hash-style=sysv -shared -soname shared %t1 --version-script %t.script -o %t.so
7# RUN: llvm-readobj -V --dyn-syms %t.so | FileCheck --check-prefix=DSO %s
8
9# DSO:      DynamicSymbols [
10# DSO-NEXT:    Symbol {
11# DSO-NEXT:      Name:
12# DSO-NEXT:      Value: 0x0
13# DSO-NEXT:      Size: 0
14# DSO-NEXT:      Binding: Local
15# DSO-NEXT:      Type: None
16# DSO-NEXT:      Other: 0
17# DSO-NEXT:      Section: Undefined
18# DSO-NEXT:    }
19# DSO-NEXT:    Symbol {
20# DSO-NEXT:      Name: a@@V1
21# DSO-NEXT:      Value: 0x12E8
22# DSO-NEXT:      Size: 0
23# DSO-NEXT:      Binding: Global
24# DSO-NEXT:      Type: Function
25# DSO-NEXT:      Other: 0
26# DSO-NEXT:      Section: .text
27# DSO-NEXT:    }
28# DSO-NEXT:    Symbol {
29# DSO-NEXT:      Name: b@@V2
30# DSO-NEXT:      Value: 0x12EA
31# DSO-NEXT:      Size: 0
32# DSO-NEXT:      Binding: Global
33# DSO-NEXT:      Type: Function
34# DSO-NEXT:      Other: 0
35# DSO-NEXT:      Section: .text
36# DSO-NEXT:    }
37# DSO-NEXT:    Symbol {
38# DSO-NEXT:      Name: b@V1
39# DSO-NEXT:      Value: 0x12E9
40# DSO-NEXT:      Size: 0
41# DSO-NEXT:      Binding: Global
42# DSO-NEXT:      Type: Function
43# DSO-NEXT:      Other: 0
44# DSO-NEXT:      Section: .text
45# DSO-NEXT:    }
46# DSO-NEXT:    Symbol {
47# DSO-NEXT:      Name: c@@V2
48# DSO-NEXT:      Value: 0x12EB
49# DSO-NEXT:      Size: 0
50# DSO-NEXT:      Binding: Global
51# DSO-NEXT:      Type: Function
52# DSO-NEXT:      Other: 0
53# DSO-NEXT:      Section: .text
54# DSO-NEXT:    }
55# DSO-NEXT:  ]
56# DSO-NEXT:  VersionSymbols [
57# DSO-NEXT:    Symbol {
58# DSO-NEXT:      Version: 0
59# DSO-NEXT:      Name:
60# DSO-NEXT:    }
61# DSO-NEXT:    Symbol {
62# DSO-NEXT:      Version: 2
63# DSO-NEXT:      Name: a@@V1
64# DSO-NEXT:    }
65# DSO-NEXT:    Symbol {
66# DSO-NEXT:      Version: 3
67# DSO-NEXT:      Name: b@@V2
68# DSO-NEXT:    }
69# DSO-NEXT:    Symbol {
70# DSO-NEXT:      Version: 2
71# DSO-NEXT:      Name: b@V1
72# DSO-NEXT:    }
73# DSO-NEXT:    Symbol {
74# DSO-NEXT:      Version: 3
75# DSO-NEXT:      Name: c@@V2
76# DSO-NEXT:    }
77# DSO-NEXT:  ]
78# DSO-NEXT:  VersionDefinitions [
79# DSO-NEXT:    Definition {
80# DSO-NEXT:      Version: 1
81# DSO-NEXT:      Flags [ (0x1)
82# DSO-NEXT:        Base (0x1)
83# DSO-NEXT:      ]
84# DSO-NEXT:      Index: 1
85# DSO-NEXT:      Hash: 127830196
86# DSO-NEXT:      Name: shared
87# DSO-NEXT:      Predecessors: []
88# DSO-NEXT:    }
89# DSO-NEXT:    Definition {
90# DSO-NEXT:      Version: 1
91# DSO-NEXT:      Flags [ (0x0)
92# DSO-NEXT:      ]
93# DSO-NEXT:      Index: 2
94# DSO-NEXT:      Hash: 1425
95# DSO-NEXT:      Name: V1
96# DSO-NEXT:      Predecessors: []
97# DSO-NEXT:    }
98# DSO-NEXT:    Definition {
99# DSO-NEXT:      Version: 1
100# DSO-NEXT:      Flags [ (0x0)
101# DSO-NEXT:      ]
102# DSO-NEXT:      Index: 3
103# DSO-NEXT:      Hash: 1426
104# DSO-NEXT:      Name: V2
105# DSO-NEXT:      Predecessors: []
106# DSO-NEXT:    }
107# DSO-NEXT:  ]
108
109## Check that we can link against DSO produced.
110# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2
111# RUN: ld.lld --hash-style=sysv %t2 %t.so -o %t3
112# RUN: llvm-readobj -V --dyn-syms %t3 | FileCheck --check-prefix=EXE %s
113
114# EXE:      DynamicSymbols [
115# EXE-NEXT:    Symbol {
116# EXE-NEXT:      Name:
117# EXE-NEXT:      Value: 0x0
118# EXE-NEXT:      Size: 0
119# EXE-NEXT:      Binding: Local
120# EXE-NEXT:      Type: None
121# EXE-NEXT:      Other: 0
122# EXE-NEXT:      Section: Undefined
123# EXE-NEXT:    }
124# EXE-NEXT:    Symbol {
125# EXE-NEXT:      Name: a@V1
126# EXE-NEXT:      Value: 0x201340
127# EXE-NEXT:      Size: 0
128# EXE-NEXT:      Binding: Global
129# EXE-NEXT:      Type: Function
130# EXE-NEXT:      Other: 0
131# EXE-NEXT:      Section: Undefined
132# EXE-NEXT:    }
133# EXE-NEXT:    Symbol {
134# EXE-NEXT:      Name: b@V2
135# EXE-NEXT:      Value: 0x201350
136# EXE-NEXT:      Size: 0
137# EXE-NEXT:      Binding: Global
138# EXE-NEXT:      Type: Function
139# EXE-NEXT:      Other: 0
140# EXE-NEXT:      Section: Undefined
141# EXE-NEXT:    }
142# EXE-NEXT:    Symbol {
143# EXE-NEXT:      Name: c@V2
144# EXE-NEXT:      Value: 0x201360
145# EXE-NEXT:      Size: 0
146# EXE-NEXT:      Binding: Global
147# EXE-NEXT:      Type: Function
148# EXE-NEXT:      Other: 0
149# EXE-NEXT:      Section: Undefined
150# EXE-NEXT:    }
151# EXE-NEXT:  ]
152# EXE-NEXT:  VersionSymbols [
153# EXE-NEXT:    Symbol {
154# EXE-NEXT:      Version: 0
155# EXE-NEXT:      Name:
156# EXE-NEXT:    }
157# EXE-NEXT:    Symbol {
158# EXE-NEXT:      Version: 2
159# EXE-NEXT:      Name: a@V1
160# EXE-NEXT:    }
161# EXE-NEXT:    Symbol {
162# EXE-NEXT:      Version: 3
163# EXE-NEXT:      Name: b@V2
164# EXE-NEXT:    }
165# EXE-NEXT:    Symbol {
166# EXE-NEXT:      Version: 3
167# EXE-NEXT:      Name: c@V2
168# EXE-NEXT:    }
169# EXE-NEXT:  ]
170# EXE-NEXT:  VersionDefinitions [
171# EXE-NEXT:  ]
172# EXE-NEXT:  VersionRequirements [
173# EXE-NEXT:    Dependency {
174# EXE-NEXT:      Version: 1
175# EXE-NEXT:      Count: 2
176# EXE-NEXT:      FileName: shared
177# EXE-NEXT:      Entries [
178# EXE-NEXT:        Entry {
179# EXE-NEXT:          Hash: 1425
180# EXE-NEXT:          Flags [ (0x0)
181# EXE-NEXT:          ]
182# EXE-NEXT:          Index: 2
183# EXE-NEXT:          Name: V1
184# EXE-NEXT:        }
185# EXE-NEXT:        Entry {
186# EXE-NEXT:          Hash: 1426
187# EXE-NEXT:          Flags [ (0x0)
188# EXE-NEXT:          ]
189# EXE-NEXT:          Index: 3
190# EXE-NEXT:          Name: V2
191# EXE-NEXT:        }
192# EXE-NEXT:      ]
193# EXE-NEXT:    }
194# EXE-NEXT:  ]
195
196.globl _start
197_start:
198  .long a - .
199  .long b - .
200  .long c - .
201