xref: /llvm-project/llvm/test/tools/llvm-objcopy/ELF/set-symbol-visibility.test (revision 07d8a457ad8bb9a14974b9cb47072746c7f5e489)
1# RUN: yaml2obj --docnum=1 %s -o %t.o
2# RUN: echo '.*' > %t.symbols.regex
3
4## Check that the visibility of all symbols is properly set to DEFAULT.
5# RUN: llvm-objcopy %t.o %t0.o --set-symbols-visibility=%t.symbols.regex=default --regex
6# RUN: llvm-readelf -s %t0.o | FileCheck %s --check-prefix=DEF
7
8# DEF-DAG: DEFAULT     1 default_local
9# DEF-DAG: DEFAULT     1 internal_local
10# DEF-DAG: DEFAULT     1 hidden_local
11# DEF-DAG: DEFAULT     1 protected_local
12# DEF-DAG: DEFAULT     1 default_global
13# DEF-DAG: DEFAULT     1 default_weak
14# DEF-DAG: DEFAULT     1 internal_global
15# DEF-DAG: DEFAULT     1 internal_weak
16# DEF-DAG: DEFAULT     1 hidden_global
17# DEF-DAG: DEFAULT     1 hidden_weak
18# DEF-DAG: DEFAULT     1 protected_global
19# DEF-DAG: DEFAULT     1 protected_weak
20
21## Check that the visibility of all symbols is properly set to HIDDEN.
22# RUN: llvm-objcopy %t.o %t1.o --set-symbols-visibility=%t.symbols.regex=hidden --regex
23# RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=HID
24
25# HID-DAG: HIDDEN      1 default_local
26# HID-DAG: HIDDEN      1 internal_local
27# HID-DAG: HIDDEN      1 hidden_local
28# HID-DAG: HIDDEN      1 protected_local
29# HID-DAG: HIDDEN      1 default_global
30# HID-DAG: HIDDEN      1 default_weak
31# HID-DAG: HIDDEN      1 internal_global
32# HID-DAG: HIDDEN      1 internal_weak
33# HID-DAG: HIDDEN      1 hidden_global
34# HID-DAG: HIDDEN      1 hidden_weak
35# HID-DAG: HIDDEN      1 protected_global
36# HID-DAG: HIDDEN      1 protected_weak
37
38## Check that the visibility of all symbols is properly set to PROTECTED.
39# RUN: llvm-objcopy %t.o %t2.o --set-symbols-visibility=%t.symbols.regex=protected --regex
40# RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=PRO
41
42# PRO-DAG: PROTECTED   1 default_local
43# PRO-DAG: PROTECTED   1 internal_local
44# PRO-DAG: PROTECTED   1 hidden_local
45# PRO-DAG: PROTECTED   1 protected_local
46# PRO-DAG: PROTECTED   1 default_global
47# PRO-DAG: PROTECTED   1 default_weak
48# PRO-DAG: PROTECTED   1 internal_global
49# PRO-DAG: PROTECTED   1 internal_weak
50# PRO-DAG: PROTECTED   1 hidden_global
51# PRO-DAG: PROTECTED   1 hidden_weak
52# PRO-DAG: PROTECTED   1 protected_global
53# PRO-DAG: PROTECTED   1 protected_weak
54
55## Check that the visibility of all symbols is properly set to INTERNAL.
56# RUN: llvm-objcopy %t.o %t3.o --set-symbols-visibility=%t.symbols.regex=internal --regex
57# RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=INT
58
59# INT-DAG: INTERNAL    1 default_local
60# INT-DAG: INTERNAL    1 internal_local
61# INT-DAG: INTERNAL    1 hidden_local
62# INT-DAG: INTERNAL    1 protected_local
63# INT-DAG: INTERNAL    1 default_global
64# INT-DAG: INTERNAL    1 default_weak
65# INT-DAG: INTERNAL    1 internal_global
66# INT-DAG: INTERNAL    1 internal_weak
67# INT-DAG: INTERNAL    1 hidden_global
68# INT-DAG: INTERNAL    1 hidden_weak
69# INT-DAG: INTERNAL    1 protected_global
70# INT-DAG: INTERNAL    1 protected_weak
71
72## Check that setting the visibility of certain symbols that were read from
73## a file does not affect other symbols.
74# RUN: echo -e "default_local\ninternal_local" > %t.symbol.list
75# RUN: llvm-objcopy %t.o %t4.o --set-symbols-visibility=%t.symbol.list=hidden
76# RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=FILE
77
78# FILE-DAG: HIDDEN      1 default_local
79# FILE-DAG: HIDDEN      1 internal_local
80## Unaffected symbols:
81# FILE-DAG: HIDDEN      1 hidden_local
82# FILE-DAG: PROTECTED   1 protected_local
83# FILE-DAG: DEFAULT     1 default_global
84# FILE-DAG: DEFAULT     1 default_weak
85# FILE-DAG: INTERNAL    1 internal_global
86# FILE-DAG: INTERNAL    1 internal_weak
87# FILE-DAG: HIDDEN      1 hidden_global
88# FILE-DAG: HIDDEN      1 hidden_weak
89# FILE-DAG: PROTECTED   1 protected_global
90# FILE-DAG: PROTECTED   1 protected_weak
91
92## Check that the visibility of a single symbol is set correctly,
93## and that no other symbols are affected.
94# RUN: llvm-objcopy %t.o %t5.o --set-symbol-visibility=default_local=hidden \
95# RUN:                         --set-symbol-visibility=internal_local=protected \
96# RUN:                         --set-symbol-visibility=hidden_local=internal \
97# RUN:                         --set-symbol-visibility=protected_local=default
98# RUN: llvm-readelf -s %t5.o | FileCheck %s --check-prefix=SINGLE
99
100# SINGLE-DAG: HIDDEN      1 default_local
101# SINGLE-DAG: PROTECTED   1 internal_local
102# SINGLE-DAG: INTERNAL    1 hidden_local
103# SINGLE-DAG: DEFAULT     1 protected_local
104## Unaffected symbols:
105# SINGLE-DAG: DEFAULT     1 default_global
106# SINGLE-DAG: DEFAULT     1 default_weak
107# SINGLE-DAG: INTERNAL    1 internal_global
108# SINGLE-DAG: INTERNAL    1 internal_weak
109# SINGLE-DAG: HIDDEN      1 hidden_global
110# SINGLE-DAG: HIDDEN      1 hidden_weak
111# SINGLE-DAG: PROTECTED   1 protected_global
112# SINGLE-DAG: PROTECTED   1 protected_weak
113
114## Check that the visibility of symbols specified by a regex are set correctly,
115## and that no other symbols are affected.
116# RUN: llvm-objcopy %t.o %t6.o --set-symbol-visibility='.*'_local=hidden --regex
117# RUN: llvm-readelf -s %t6.o | FileCheck %s --check-prefix=REGEX
118
119# REGEX-DAG: HIDDEN      1 default_local
120# REGEX-DAG: HIDDEN      1 internal_local
121# REGEX-DAG: HIDDEN      1 hidden_local
122# REGEX-DAG: HIDDEN      1 protected_local
123## Unaffected symbols:
124# REGEX-DAG: DEFAULT     1 default_global
125# REGEX-DAG: DEFAULT     1 default_weak
126# REGEX-DAG: INTERNAL    1 internal_global
127# REGEX-DAG: INTERNAL    1 internal_weak
128# REGEX-DAG: HIDDEN      1 hidden_global
129# REGEX-DAG: HIDDEN      1 hidden_weak
130# REGEX-DAG: PROTECTED   1 protected_global
131# REGEX-DAG: PROTECTED   1 protected_weak
132
133## Check that the visibility of symbols specified by a wildcard are set correctly,
134## and that no other symbols are affected.
135# RUN: llvm-objcopy %t.o %t7.o --set-symbol-visibility='*_local'=hidden --wildcard
136# RUN: llvm-readelf -s %t7.o | FileCheck %s --check-prefix=WILDCARD
137
138# WILDCARD-DAG: HIDDEN      1 default_local
139# WILDCARD-DAG: HIDDEN      1 internal_local
140# WILDCARD-DAG: HIDDEN      1 hidden_local
141# WILDCARD-DAG: HIDDEN      1 protected_local
142## Unaffected symbols:
143# WILDCARD-DAG: DEFAULT     1 default_global
144# WILDCARD-DAG: DEFAULT     1 default_weak
145# WILDCARD-DAG: INTERNAL    1 internal_global
146# WILDCARD-DAG: INTERNAL    1 internal_weak
147# WILDCARD-DAG: HIDDEN      1 hidden_global
148# WILDCARD-DAG: HIDDEN      1 hidden_weak
149# WILDCARD-DAG: PROTECTED   1 protected_global
150# WILDCARD-DAG: PROTECTED   1 protected_weak
151
152## Check that the latest option that matches the same symbols as any of the previous
153## options overwrites the visibility of these symbols.
154# RUN: echo -e '*_weak\n*_local' > %t.symbols.pattern
155# RUN: llvm-objcopy %t.o %t8.o --set-symbol-visibility='default_*'=hidden \
156# RUN:                         --set-symbol-visibility='internal_*'=hidden \
157# RUN:                         --set-symbols-visibility=%t.symbols.pattern=protected \
158# RUN:                         --wildcard
159# RUN: llvm-readelf -s %t8.o | FileCheck %s --check-prefix=REWRITE
160
161# REWRITE-DAG: PROTECTED   1 default_local
162# REWRITE-DAG: HIDDEN      1 default_global
163# REWRITE-DAG: PROTECTED   1 default_weak
164# REWRITE-DAG: PROTECTED   1 internal_local
165# REWRITE-DAG: HIDDEN      1 internal_global
166# REWRITE-DAG: PROTECTED   1 internal_weak
167# REWRITE-DAG: PROTECTED   1 hidden_local
168# REWRITE-DAG: PROTECTED   1 hidden_weak
169# REWRITE-DAG: PROTECTED   1 protected_local
170# REWRITE-DAG: PROTECTED   1 protected_weak
171## Unaffected symbols:
172# REWRITE-DAG: HIDDEN      1 hidden_global
173# REWRITE-DAG: PROTECTED   1 protected_global
174
175## Check that a symbol name with a special charater is treated as a plain name
176## when pattern matching options are not enabled.
177# RUN: yaml2obj --docnum=2 %s -o %t9.o
178# RUN: llvm-objcopy %t9.o --set-symbol-visibility='f*o'=hidden
179# RUN: llvm-readelf -s %t9.o | FileCheck %s --check-prefix=SPECIAL
180
181# SPECIAL-DAG: HIDDEN      1 f*o
182## Unaffected symbol:
183# SPECIAL-DAG: DEFAULT     1 foo
184
185# RUN: yaml2obj --docnum=3 %s -o %t10.o
186
187## Check that the visibility of undefined symbols can be changed as well.
188# RUN: llvm-objcopy %t10.o --set-symbol-visibility=foo=hidden
189# RUN: llvm-readelf -s %t10.o | FileCheck %s --check-prefix=UNDEF
190# UNDEF: HIDDEN    UND foo
191
192## Check that passing an invalid visibility type generates an error message.
193# RUN: echo 'foo' > %t.symbols
194# RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols=invalid-type 2>&1 | \
195# RUN:   FileCheck %s --check-prefix=TYPE
196# RUN: not llvm-objcopy %t10.o --set-symbol-visibility=foo=invalid-type 2>&1 | \
197# RUN:   FileCheck %s --check-prefix=TYPE
198# TYPE: error: 'invalid-type' is not a valid symbol visibility
199
200## Check that omitting the '=' character generates an error.
201# RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols,hidden 2>&1 | \
202# RUN:   FileCheck %s --check-prefix=FORMAT -DOPTION=--set-symbols-visibility
203# RUN: not llvm-objcopy %t10.o --set-symbol-visibility=foo default 2>&1 | \
204# RUN:   FileCheck %s --check-prefix=FORMAT -DOPTION=--set-symbol-visibility
205# FORMAT: error: bad format for [[OPTION]]
206
207## Check that using an invalid symbol pattern generates an error.
208# RUN: echo '*.' > %t.symbols.regex
209# RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols.regex=hidden --regex 2>&1 | \
210# RUN:   FileCheck %s --check-prefix=SYMBOL
211# RUN: not llvm-objcopy %t10.o --set-symbol-visibility='*.'=default --regex 2>&1 | \
212# RUN:   FileCheck %s --check-prefix=SYMBOL
213# SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid
214
215## Check passing an invalid filename generates an error.
216# RUN: not llvm-objcopy %t10.o --set-symbols-visibility=no_file=hidden 2>&1 | \
217# RUN:   FileCheck %s --check-prefix=NO_FILE -DMSG=%errc_ENOENT
218# NO_FILE: error: 'no_file': [[MSG]]
219
220---
221!ELF
222FileHeader:
223  Class:   ELFCLASS64
224  Data:    ELFDATA2LSB
225  Type:    ET_REL
226  Machine: EM_X86_64
227Sections:
228  - Name:  .text
229    Type:  SHT_PROGBITS
230Symbols:
231  - Name:    default_local
232    Section: .text
233    Binding:  STB_LOCAL
234  - Name:    protected_local
235    Section: .text
236    Binding:  STB_LOCAL
237    Other:    [ STV_PROTECTED ]
238  - Name:    internal_local
239    Section: .text
240    Binding:  STB_LOCAL
241    Other:    [ STV_INTERNAL ]
242  - Name:    hidden_local
243    Section: .text
244    Binding:  STB_LOCAL
245    Other:    [ STV_HIDDEN ]
246  - Name:    default_weak
247    Section: .text
248    Binding:  STB_WEAK
249  - Name:    internal_weak
250    Section: .text
251    Binding:  STB_WEAK
252    Other:    [ STV_INTERNAL ]
253  - Name:    hidden_weak
254    Section: .text
255    Binding:  STB_WEAK
256    Other:    [ STV_HIDDEN ]
257  - Name:    protected_weak
258    Section: .text
259    Binding:  STB_WEAK
260    Other:    [ STV_PROTECTED ]
261  - Name:    default_global
262    Section: .text
263    Binding:  STB_GLOBAL
264  - Name:    internal_global
265    Section: .text
266    Binding:  STB_GLOBAL
267    Other:    [ STV_INTERNAL ]
268  - Name:    hidden_global
269    Section: .text
270    Binding:  STB_GLOBAL
271    Other:    [ STV_HIDDEN ]
272  - Name:    protected_global
273    Section: .text
274    Binding:  STB_GLOBAL
275    Other:    [ STV_PROTECTED ]
276  - Name:    ignored_name
277    Section: .text
278    Binding:  STB_GLOBAL
279    Other:    [ STV_INTERNAL ]
280...
281
282---
283!ELF
284FileHeader:
285  Class:   ELFCLASS64
286  Data:    ELFDATA2LSB
287  Type:    ET_REL
288  Machine: EM_X86_64
289Sections:
290  - Name:  .text
291    Type:  SHT_PROGBITS
292Symbols:
293  - Name:    f*o
294    Section: .text
295    Binding:  STB_LOCAL
296  - Name:    foo
297    Section: .text
298    Binding:  STB_LOCAL
299...
300
301---
302!ELF
303FileHeader:
304  Class:   ELFCLASS64
305  Data:    ELFDATA2LSB
306  Type:    ET_REL
307  Machine: EM_X86_64
308Symbols:
309  - Name:     foo
310    Binding:  STB_LOCAL
311...
312