xref: /llvm-project/lld/test/ELF/bsymbolic.s (revision 97e39f96c83f73d44c9b34d93d1249b5936a3be5)
1# REQUIRES: x86
2# RUN: rm -rf %t && split-file %s %t
3# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o
4# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/b.s -o %t/b.o
5# RUN: ld.lld -shared %t/a.o %t/b.o -o %t0.so
6# RUN: llvm-readobj -r %t0.so | FileCheck %s --check-prefix=REL_DEF
7# RUN: llvm-objdump -d %t0.so | FileCheck %s --check-prefix=ASM_DEF
8
9## -Bsymbolic-non-weak-functions makes all STB_GLOBAL STT_FUNC definitions non-preemptible.
10# RUN: ld.lld -shared -Bsymbolic-non-weak-functions %t/a.o %t/b.o -o %t1.so
11# RUN: llvm-readobj -r %t1.so | FileCheck %s --check-prefix=REL_GFUN
12# RUN: llvm-objdump -d %t1.so | FileCheck %s --check-prefix=ASM_GFUN
13
14## -Bsymbolic-functions makes all STT_FUNC definitions non-preemptible.
15# RUN: ld.lld -shared -Bsymbolic-functions %t/a.o %t/b.o -o %t2.so
16# RUN: llvm-readobj -r %t2.so | FileCheck %s --check-prefix=REL_FUN
17# RUN: llvm-objdump -d %t2.so | FileCheck %s --check-prefix=ASM_FUN
18
19## -Bsymbolic makes all definitions non-preemptible.
20# RUN: ld.lld -shared -Bsymbolic %t/a.o %t/b.o -o %t3.so
21# RUN: llvm-readobj -r %t3.so | FileCheck %s --check-prefix=REL_ALL
22# RUN: llvm-objdump -d %t3.so | FileCheck %s --check-prefix=ASM_ALL
23
24## -Bsymbolic-non-weak makes all STB_GLOBAL definitions non-preemptible.
25# RUN: ld.lld -shared -Bsymbolic-non-weak %t/a.o %t/b.o -o %t4.so
26# RUN: llvm-readobj -r %t4.so | FileCheck %s --check-prefix=REL_GALL
27# RUN: llvm-objdump -d %t4.so | FileCheck %s --check-prefix=ASM_GALL
28
29# RUN: ld.lld -shared -Bsymbolic-functions -Bsymbolic %t/a.o %t/b.o -o %t.so
30# RUN: cmp %t.so %t3.so
31# RUN: ld.lld -shared -Bsymbolic -Bsymbolic-functions %t/a.o %t/b.o -o %t.so
32# RUN: cmp %t.so %t2.so
33# RUN: ld.lld -shared -Bno-symbolic -Bsymbolic %t/a.o %t/b.o -o %t.so
34# RUN: cmp %t.so %t3.so
35
36## -Bno-symbolic can cancel previously specified -Bsymbolic and -Bsymbolic-functions.
37# RUN: ld.lld -shared -Bsymbolic -Bno-symbolic %t/a.o %t/b.o -o %t.so
38# RUN: cmp %t.so %t0.so
39# RUN: ld.lld -shared -Bsymbolic-functions -Bno-symbolic %t/a.o %t/b.o -o %t.so
40# RUN: cmp %t.so %t0.so
41
42# REL_DEF:      .rela.dyn {
43# REL_DEF-NEXT:   R_X86_64_RELATIVE -
44# REL_DEF-NEXT:   R_X86_64_RELATIVE -
45# REL_DEF-NEXT:   R_X86_64_64 data_weak_default
46# REL_DEF-NEXT:   R_X86_64_64 data_default
47# REL_DEF-NEXT: }
48# REL_DEF-NEXT: .rela.plt {
49# REL_DEF-NEXT:   R_X86_64_JUMP_SLOT default
50# REL_DEF-NEXT:   R_X86_64_JUMP_SLOT notype_default
51# REL_DEF-NEXT:   R_X86_64_JUMP_SLOT weak_default
52# REL_DEF-NEXT:   R_X86_64_JUMP_SLOT ext_default
53# REL_DEF-NEXT:   R_X86_64_JUMP_SLOT undef
54# REL_DEF-NEXT: }
55
56# ASM_DEF:      <_start>:
57# ASM_DEF-NEXT:   callq {{.*}} <default@plt>
58# ASM_DEF-NEXT:   callq {{.*}} <protected>
59# ASM_DEF-NEXT:   callq {{.*}} <hidden>
60# ASM_DEF-NEXT:   callq {{.*}} <weak_default@plt>
61# ASM_DEF-NEXT:   callq {{.*}} <ext_default@plt>
62# ASM_DEF-NEXT:   callq {{.*}} <notype_default@plt>
63# ASM_DEF-NEXT:   callq {{.*}} <undef@plt>
64
65# REL_GFUN:      .rela.dyn {
66# REL_GFUN-NEXT:   R_X86_64_RELATIVE -
67# REL_GFUN-NEXT:   R_X86_64_RELATIVE -
68# REL_GFUN-NEXT:   R_X86_64_64 data_weak_default
69# REL_GFUN-NEXT:   R_X86_64_64 data_default
70# REL_GFUN-NEXT: }
71# REL_GFUN-NEXT: .rela.plt {
72# REL_GFUN-NEXT:   R_X86_64_JUMP_SLOT notype_default
73# REL_GFUN-NEXT:   R_X86_64_JUMP_SLOT weak_default
74# REL_GFUN-NEXT:   R_X86_64_JUMP_SLOT undef
75# REL_GFUN-NEXT: }
76
77# ASM_GFUN:      <_start>:
78# ASM_GFUN-NEXT:   callq {{.*}} <default>
79# ASM_GFUN-NEXT:   callq {{.*}} <protected>
80# ASM_GFUN-NEXT:   callq {{.*}} <hidden>
81# ASM_GFUN-NEXT:   callq {{.*}} <weak_default@plt>
82# ASM_GFUN-NEXT:   callq {{.*}} <ext_default>
83# ASM_GFUN-NEXT:   callq {{.*}} <notype_default@plt>
84# ASM_GFUN-NEXT:   callq {{.*}} <undef@plt>
85
86# REL_FUN:      .rela.dyn {
87# REL_FUN-NEXT:   R_X86_64_RELATIVE -
88# REL_FUN-NEXT:   R_X86_64_RELATIVE -
89# REL_FUN-NEXT:   R_X86_64_64 data_weak_default
90# REL_FUN-NEXT:   R_X86_64_64 data_default
91# REL_FUN-NEXT: }
92# REL_FUN-NEXT: .rela.plt {
93# REL_FUN-NEXT:   R_X86_64_JUMP_SLOT notype_default
94# REL_FUN-NEXT:   R_X86_64_JUMP_SLOT undef
95# REL_FUN-NEXT: }
96
97# ASM_FUN:      <_start>:
98# ASM_FUN-NEXT:   callq {{.*}} <default>
99# ASM_FUN-NEXT:   callq {{.*}} <protected>
100# ASM_FUN-NEXT:   callq {{.*}} <hidden>
101# ASM_FUN-NEXT:   callq {{.*}} <weak_default>
102# ASM_FUN-NEXT:   callq {{.*}} <ext_default>
103# ASM_FUN-NEXT:   callq {{.*}} <notype_default@plt>
104# ASM_FUN-NEXT:   callq {{.*}} <undef@plt>
105
106# REL_ALL:      .rela.dyn {
107# REL_ALL-NEXT:   R_X86_64_RELATIVE -
108# REL_ALL-NEXT:   R_X86_64_RELATIVE -
109# REL_ALL-NEXT:   R_X86_64_RELATIVE -
110# REL_ALL-NEXT:   R_X86_64_RELATIVE -
111# REL_ALL-NEXT: }
112# REL_ALL-NEXT: .rela.plt {
113# REL_ALL-NEXT:   R_X86_64_JUMP_SLOT undef
114# REL_ALL-NEXT: }
115
116# ASM_ALL:      <_start>:
117# ASM_ALL-NEXT:   callq {{.*}} <default>
118# ASM_ALL-NEXT:   callq {{.*}} <protected>
119# ASM_ALL-NEXT:   callq {{.*}} <hidden>
120# ASM_ALL-NEXT:   callq {{.*}} <weak_default>
121# ASM_ALL-NEXT:   callq {{.*}} <ext_default>
122# ASM_ALL-NEXT:   callq {{.*}} <notype_default>
123# ASM_ALL-NEXT:   callq {{.*}} <undef@plt>
124
125# REL_GALL:      .rela.dyn {
126# REL_GALL-NEXT:   R_X86_64_RELATIVE -
127# REL_GALL-NEXT:   R_X86_64_RELATIVE -
128# REL_GALL-NEXT:   R_X86_64_RELATIVE -
129# REL_GALL-NEXT:   R_X86_64_64 data_weak_default
130# REL_GALL-NEXT: }
131# REL_GALL-NEXT: .rela.plt {
132# REL_GALL-NEXT:   R_X86_64_JUMP_SLOT weak_default
133# REL_GALL-NEXT:   R_X86_64_JUMP_SLOT undef
134# REL_GALL-NEXT: }
135
136# ASM_GALL:      <_start>:
137# ASM_GALL-NEXT:   callq {{.*}} <default>
138# ASM_GALL-NEXT:   callq {{.*}} <protected>
139# ASM_GALL-NEXT:   callq {{.*}} <hidden>
140# ASM_GALL-NEXT:   callq {{.*}} <weak_default@plt>
141# ASM_GALL-NEXT:   callq {{.*}} <ext_default>
142# ASM_GALL-NEXT:   callq {{.*}} <notype_default>
143# ASM_GALL-NEXT:   callq {{.*}} <undef@plt>
144
145#--- a.s
146.globl default, protected, hidden, notype_default
147.weak weak_default
148.protected protected
149.hidden hidden
150.type default, @function
151.type protected, @function
152.type hidden, @function
153.type weak_default, @function
154default: nop
155protected: nop
156hidden: nop
157weak_default: nop
158notype_default: nop
159
160.globl _start
161_start:
162  callq default@PLT
163  callq protected@PLT
164  callq hidden@PLT
165
166  callq weak_default@PLT
167
168  callq ext_default@PLT
169
170  callq notype_default@PLT
171
172  callq undef@PLT
173
174.data
175  .quad data_default
176  .quad data_weak_default
177  .quad data_protected
178  .quad data_hidden
179
180.globl data_default, data_weak_default, data_protected, data_hidden
181.weak data_weak_default
182.protected data_protected
183.hidden data_hidden
184.type data_default, @object
185.type data_weak_default, @object
186.type data_protected, @object
187.type data_hidden, @object
188data_default: .byte 0
189data_weak_default: .byte 0
190data_protected: .byte 0
191data_hidden: .byte 0
192
193#--- b.s
194.globl ext_default
195.type ext_default,@function
196ext_default:
197  nop
198