xref: /llvm-project/llvm/test/tools/llvm-objcopy/ELF/wildcard-flags.test (revision 1562e4552cd1b3d2eadd956c966f8a60e928b8ca)
1## This test checks basic functionality of glob (or "shell wildcard") matching,
2## as well as verifying all the relevant flags in llvm-objcopy and llvm-strip
3## are configured correctly.
4## For more detailed syntax tests, see wildcard-syntax.test.
5
6# RUN: yaml2obj %s -o %t.o
7
8## Check that --regex and --wildcard cannot be used together.
9# RUN: not llvm-objcopy --regex --wildcard %t.o %t.err.o 2>&1 \
10# RUN:   | FileCheck %s --check-prefix=ERR
11# RUN: not llvm-strip --regex --wildcard %t.o -o %t.err.o 2>&1 \
12# RUN:   | FileCheck %s --check-prefix=ERR
13
14# ERR: error: --regex and --wildcard are incompatible
15
16## Check that section removal flags default to glob matches.
17
18## --keep-section:
19# RUN: llvm-objcopy --strip-all --keep-section='.f*' %t.o %t.ksec.1.o
20# RUN: llvm-readobj --sections %t.ksec.1.o \
21# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,SEC,FOO-SEC
22# RUN: llvm-strip --strip-all --keep-section='.f*' %t.o -o %t.ksec.2.o
23# RUN: cmp %t.ksec.1.o %t.ksec.2.o
24
25## --only-section:
26# RUN: llvm-objcopy --strip-all --only-section='.f*' %t.o %t.osec.1.o
27# RUN: llvm-readobj --sections %t.osec.1.o \
28# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,SEC,FOO-SEC
29
30## --remove-section:
31# RUN: llvm-objcopy --strip-debug --remove-section='.s??tab' %t.o %t.rsec.1.o
32# RUN: llvm-readobj --sections %t.rsec.1.o \
33# RUN:   | FileCheck %s --implicit-check-not=Name: \
34# RUN:       --check-prefixes=CHECK,SEC,FOO-SEC,BAR-SEC
35# RUN: llvm-strip --strip-debug --remove-section='.s??tab' %t.o -o %t.rsec.2.o
36# RUN: cmp %t.rsec.1.o %t.rsec.2.o
37
38## Check that symbol removal options default to literal matches. Adding -w
39## enables glob support for these options.
40
41## --globalize-symbol:
42# RUN: llvm-objcopy --globalize-symbol='*' %t.o %t.globsym.1.o
43# RUN: llvm-readobj --symbols %t.globsym.1.o \
44# RUN:   | FileCheck %s --implicit-check-not=Name: \
45# RUN:       --check-prefixes=CHECK,LOCAL,FOO-SYM,BAR-SYM
46
47# RUN: llvm-objcopy -w --globalize-symbol='*' %t.o %t.globsym.2.o
48# RUN: llvm-readobj --symbols %t.globsym.2.o \
49# RUN:   | FileCheck %s --implicit-check-not=Name: \
50# RUN:       --check-prefixes=CHECK,GLOBAL,FOO-SYM,BAR-SYM
51
52## --keep-symbol:
53# RUN: llvm-objcopy --discard-all --keep-symbol='f*' %t.o %t.ksym.1.o
54# RUN: llvm-readobj --symbols %t.ksym.1.o \
55# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK
56# RUN: llvm-strip --discard-all --keep-symbol='f*' %t.o -o %t.ksym.2.o
57# RUN: cmp %t.ksym.1.o %t.ksym.2.o
58
59# RUN: llvm-objcopy --discard-all -w --keep-symbol='f*' %t.o %t.ksym.3.o
60# RUN: llvm-readobj --symbols %t.ksym.3.o \
61# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO-SYM
62# RUN: llvm-strip --discard-all -w --keep-symbol='f*' %t.o -o %t.ksym.4.o
63# RUN: cmp %t.ksym.3.o %t.ksym.4.o
64
65## --keep-symbols:
66# RUN: echo 'f*' > %t-fstar.txt
67# RUN: llvm-objcopy --discard-all --keep-symbols=%t-fstar.txt %t.o %t.ksym.5.o
68# RUN: cmp %t.ksym.5.o %t.ksym.1.o
69
70# RUN: llvm-objcopy --discard-all -w --keep-symbols=%t-fstar.txt %t.o %t.ksym.6.o
71# RUN: cmp %t.ksym.6.o %t.ksym.3.o
72
73## --localize-symbol:
74## Note: Use %t.globsym.2.o instead of %t.o since those symbols are global.
75# RUN: llvm-objcopy --localize-symbol='*' %t.globsym.2.o %t.localsym.1.o
76# RUN: llvm-readobj --symbols %t.localsym.1.o \
77# RUN:   | FileCheck %s --implicit-check-not=Name: \
78# RUN:       --check-prefixes=CHECK,GLOBAL,FOO-SYM,BAR-SYM
79
80# RUN: llvm-objcopy -w --localize-symbol='*' %t.globsym.2.o %t.localsym.2.o
81# RUN: llvm-readobj --symbols %t.localsym.2.o \
82# RUN:   | FileCheck %s --implicit-check-not=Name: \
83# RUN:       --check-prefixes=CHECK,LOCAL,FOO-SYM,BAR-SYM
84
85## --localize-symbols:
86# RUN: echo '*' > %t-star.txt
87# RUN: llvm-objcopy --localize-symbols=%t-star.txt %t.globsym.2.o %t.localsym.3.o
88# RUN: cmp %t.localsym.3.o %t.localsym.1.o
89
90# RUN: llvm-objcopy -w --localize-symbols=%t-star.txt %t.globsym.2.o %t.localsym.4.o
91# RUN: cmp %t.localsym.4.o %t.localsym.2.o
92
93## --strip-symbol:
94# RUN: llvm-objcopy --strip-symbol='f*' %t.o %t.stripsym.1.o
95# RUN: llvm-readobj --symbols %t.stripsym.1.o \
96# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO-SYM,BAR-SYM
97# RUN: llvm-strip --strip-symbol='f*' %t.o -o %t.stripsym.2.o
98# RUN: cmp %t.stripsym.1.o %t.stripsym.2.o
99
100# RUN: llvm-objcopy -w --strip-symbol='f*' %t.o %t.stripsym.3.o
101# RUN: llvm-readobj --symbols %t.stripsym.3.o \
102# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,BAR-SYM
103# RUN: llvm-strip -w --strip-symbol='f*' %t.o -o %t.stripsym.4.o
104# RUN: cmp %t.stripsym.3.o %t.stripsym.4.o
105
106## --strip-symbols:
107# RUN: llvm-objcopy --strip-symbols=%t-fstar.txt %t.o %t.stripsym.5.o
108# RUN: cmp %t.stripsym.5.o %t.stripsym.1.o
109
110# RUN: llvm-objcopy -w --strip-symbols=%t-fstar.txt %t.o %t.stripsym.6.o
111# RUN: cmp %t.stripsym.6.o %t.stripsym.3.o
112
113## --strip-unneeded-symbol:
114# RUN: llvm-objcopy --strip-unneeded-symbol='f*' %t.o %t.stripunsym.1.o
115# RUN: llvm-readobj --symbols %t.stripunsym.1.o \
116# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,FOO-SYM,BAR-SYM
117
118# RUN: llvm-objcopy -w --strip-unneeded-symbol='f*' %t.o %t.stripunsym.2.o
119# RUN: llvm-readobj --symbols %t.stripunsym.2.o \
120# RUN:   | FileCheck %s --implicit-check-not=Name: --check-prefixes=CHECK,BAR-SYM
121
122## --strip-unneded-symbols:
123# RUN: llvm-objcopy --strip-unneeded-symbols=%t-fstar.txt %t.o %t.stripunsym.3.o
124# RUN: cmp %t.stripunsym.3.o %t.stripunsym.1.o
125
126# RUN: llvm-objcopy -w --strip-unneeded-symbols=%t-fstar.txt %t.o %t.stripunsym.4.o
127# RUN: cmp %t.stripunsym.4.o %t.stripunsym.2.o
128
129## --weaken-symbol:
130## Note: Use %t.globsym.2.o instead of %t.o since those symbols are global.
131# RUN: llvm-objcopy --weaken-symbol='*' %t.globsym.2.o %t.weaksym.1.o
132# RUN: llvm-readobj --symbols %t.weaksym.1.o \
133# RUN:   | FileCheck %s --implicit-check-not=Name: \
134# RUN:       --check-prefixes=CHECK,GLOBAL,FOO-SYM,BAR-SYM
135
136# RUN: llvm-objcopy -w --weaken-symbol='*' %t.globsym.2.o %t.weaksym.2.o
137# RUN: llvm-readobj --symbols %t.weaksym.2.o \
138# RUN:   | FileCheck %s --implicit-check-not=Name: \
139# RUN:       --check-prefixes=CHECK,WEAK,FOO-SYM,BAR-SYM
140
141## --weaken-symbols:
142# RUN: llvm-objcopy --weaken-symbols=%t-star.txt %t.globsym.2.o %t.weaksym.3.o
143# RUN: cmp %t.weaksym.3.o %t.weaksym.1.o
144
145# RUN: llvm-objcopy -w --weaken-symbols=%t-star.txt %t.globsym.2.o %t.weaksym.4.o
146# RUN: cmp %t.weaksym.4.o %t.weaksym.2.o
147
148## --keep-global-symbol:
149## Note: Use %t.globsym.2.o instead of %t.o since those symbols are global.
150# RUN: llvm-objcopy --keep-global-symbol='*' %t.globsym.2.o %t.keepgsym.1.o
151# RUN: llvm-readobj --symbols %t.keepgsym.1.o \
152# RUN:   | FileCheck %s --implicit-check-not=Name: \
153# RUN:       --check-prefixes=CHECK,LOCAL,FOO-SYM,BAR-SYM
154
155# RUN: llvm-objcopy -w --keep-global-symbol='*' %t.globsym.2.o %t.keepgsym.2.o
156# RUN: llvm-readobj --symbols %t.keepgsym.2.o \
157# RUN:   | FileCheck %s --implicit-check-not=Name: \
158# RUN:       --check-prefixes=CHECK,GLOBAL,FOO-SYM,BAR-SYM
159
160## --keep-global-symbols:
161# RUN: llvm-objcopy --keep-global-symbols=%t-star.txt %t.globsym.2.o %t.keepgsym.3.o
162# RUN: cmp %t.keepgsym.3.o %t.keepgsym.1.o
163
164# RUN: llvm-objcopy -w --keep-global-symbols=%t-star.txt %t.globsym.2.o %t.keepgsym.4.o
165# RUN: cmp %t.keepgsym.4.o %t.keepgsym.2.o
166
167## Check that -w is accepted as an alias for --wildcard.
168# RUN: llvm-objcopy --wildcard --keep-global-symbol='*' %t.globsym.2.o %t.keepgsym.5.o
169# RUN: cmp %t.keepgsym.2.o %t.keepgsym.5.o
170
171# CHECK:   LoadName:
172# CHECK:   Name: (0)
173
174# FOO-SEC: Name: .foo
175
176# FOO-SYM: Name: foo
177# GLOBAL:  Binding: Global
178# WEAK:    Binding: Weak
179# LOCAL:   Binding: Local
180
181# BAR-SEC: Name: .bar
182# BAR-SYM: Name: bar
183# GLOBAL:  Binding: Global
184# WEAK:    Binding: Weak
185# LOCAL:   Binding: Local
186
187# SEC:     Name: .shstrtab
188
189!ELF
190FileHeader:
191  Class:     ELFCLASS64
192  Data:      ELFDATA2LSB
193  Type:      ET_REL
194  Machine:   EM_X86_64
195Sections:
196  - Name:    .foo
197    Type:    SHT_PROGBITS
198  - Name:    .bar
199    Type:    SHT_PROGBITS
200Symbols:
201  - Name:    foo
202    Type:    STT_FUNC
203    Section: .foo
204  - Name:    bar
205    Type:    STT_FUNC
206    Section: .foo
207