1# REQUIRES: x86
2
3# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
4# RUN: echo "VERSION_1.0 { global: foo*; local: *; };" > %t.script
5# RUN: ld.lld --version-script %t.script -shared %t.o -o %t.so
6# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck %s
7
8# CHECK: DynamicSymbols [
9# CHECK-NEXT:   Symbol {
10# CHECK-NEXT:     Name: @
11# CHECK-NEXT:     Value: 0x0
12# CHECK-NEXT:     Size: 0
13# CHECK-NEXT:     Binding: Local
14# CHECK-NEXT:     Type: None
15# CHECK-NEXT:     Other: 0
16# CHECK-NEXT:     Section: Undefined
17# CHECK-NEXT:   }
18# CHECK-NEXT:   Symbol {
19# CHECK-NEXT:     Name: foo1@@VERSION_1.0
20# CHECK-NEXT:     Value: 0x1000
21# CHECK-NEXT:     Size: 0
22# CHECK-NEXT:     Binding: Global
23# CHECK-NEXT:     Type: None
24# CHECK-NEXT:     Other: 0
25# CHECK-NEXT:     Section: .text
26# CHECK-NEXT:   }
27# CHECK-NEXT:   Symbol {
28# CHECK-NEXT:     Name: foo2@@VERSION_1.0
29# CHECK-NEXT:     Value: 0x1001
30# CHECK-NEXT:     Size: 0
31# CHECK-NEXT:     Binding: Global
32# CHECK-NEXT:     Type: None
33# CHECK-NEXT:     Other: 0
34# CHECK-NEXT:     Section: .text
35# CHECK-NEXT:   }
36# CHECK-NEXT:   Symbol {
37# CHECK-NEXT:     Name: foo3@@VERSION_1.0
38# CHECK-NEXT:     Value: 0x1007
39# CHECK-NEXT:     Size: 0
40# CHECK-NEXT:     Binding: Global
41# CHECK-NEXT:     Type: None
42# CHECK-NEXT:     Other: 0
43# CHECK-NEXT:     Section: .text
44# CHECK-NEXT:   }
45# CHECK-NEXT: ]
46
47# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
48# RUN: echo "VERSION_1.0 { global: foo2; local: *; };" > %t2.script
49# RUN: echo "VERSION_2.0 { global: foo*; };" >> %t2.script
50# RUN: ld.lld --version-script %t2.script -shared %t.o -o %t2.so
51# RUN: llvm-readobj -dyn-symbols %t2.so | FileCheck --check-prefix=MIX %s
52
53# MIX:      DynamicSymbols [
54# MIX-NEXT:   Symbol {
55# MIX-NEXT:     Name: @
56# MIX-NEXT:     Value: 0x0
57# MIX-NEXT:     Size: 0
58# MIX-NEXT:     Binding: Local
59# MIX-NEXT:     Type: None
60# MIX-NEXT:     Other: 0
61# MIX-NEXT:     Section: Undefined
62# MIX-NEXT:   }
63# MIX-NEXT:   Symbol {
64# MIX-NEXT:     Name: foo1@@VERSION_2.0
65# MIX-NEXT:     Value: 0x1000
66# MIX-NEXT:     Size: 0
67# MIX-NEXT:     Binding: Global
68# MIX-NEXT:     Type: None
69# MIX-NEXT:     Other: 0
70# MIX-NEXT:     Section: .text
71# MIX-NEXT:   }
72# MIX-NEXT:   Symbol {
73# MIX-NEXT:     Name: foo2@@VERSION_1.0
74# MIX-NEXT:     Value: 0x1001
75# MIX-NEXT:     Size: 0
76# MIX-NEXT:     Binding: Global
77# MIX-NEXT:     Type: None
78# MIX-NEXT:     Other: 0
79# MIX-NEXT:     Section: .text
80# MIX-NEXT:   }
81# MIX-NEXT:   Symbol {
82# MIX-NEXT:     Name: foo3@@VERSION_2.0
83# MIX-NEXT:     Value: 0x1007
84# MIX-NEXT:     Size: 0
85# MIX-NEXT:     Binding: Global
86# MIX-NEXT:     Type: None
87# MIX-NEXT:     Other: 0
88# MIX-NEXT:     Section: .text
89# MIX-NEXT:   }
90# MIX-NEXT: ]
91
92.globl foo1
93foo1:
94  ret
95
96.globl foo2
97foo2:
98  call foo1@PLT
99  ret
100
101.globl foo3
102foo3:
103  call foo2@PLT
104  ret
105
106.globl _start
107_start:
108  ret
109