Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / tools / llvm-nm / dynamic.test
blob18b2a58ad6b422d86bb36313864a1cbc6deb9925
1 ## This is a test for --dynamic/-D option.
3 ## Test llvm-nm dumping ELF file with valid .dynsym section.
4 # RUN: yaml2obj --docnum=1 %s -o %t1.o
5 # RUN: llvm-nm --dynamic %t1.o | \
6 # RUN:   FileCheck %s --match-full-lines --strict-whitespace --check-prefix DYNSYM
7 # RUN: llvm-nm -D %t1.o | \
8 # RUN:   FileCheck %s --match-full-lines --strict-whitespace --check-prefix DYNSYM
10 #       DYNSYM:                 U globalsym
11 #  DYNSYM-NEXT:                 U localsym1
12 #  DYNSYM-NEXT:0000000000000000 n localsym2
13 # DYNSYM-EMPTY:
15 --- !ELF
16 FileHeader:
17   Class:   ELFCLASS64
18   Data:    ELFDATA2LSB
19   Type:    ET_DYN
20   Machine: EM_X86_64
21 Sections:
22   - Name: section
23     Type: SHT_PROGBITS
24 DynamicSymbols:
25   - Name:    localsym1
26     Type:    STT_OBJECT
27   - Name:    localsym2
28     Section: section
29   - Name:    globalsym
30     Type:    STT_OBJECT
31     Binding: STB_GLOBAL
33 ## Test llvm-nm dumping ELF file without a .dynsym section.
34 # RUN: yaml2obj --docnum=2 %s -o %t2.o
35 # RUN: llvm-nm --dynamic %t2.o 2>&1 | \
36 # RUN:   FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t2.o --check-prefix NO-SYMS
38 #       NO-SYMS:[[FILE]]: no symbols
39 # NO-SYMS-EMPTY:
41 --- !ELF
42 FileHeader:
43   Class:   ELFCLASS64
44   Data:    ELFDATA2LSB
45   Type:    ET_DYN
46   Machine: EM_X86_64
48 ## Test llvm-nm dumping ELF file with an empty .dynsym section.
49 # RUN: yaml2obj --docnum=3 %s -o %t3.o
50 # RUN: llvm-nm --dynamic %t3.o 2>&1 | \
51 # RUN:   FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t3.o --check-prefix NO-SYMS
53 --- !ELF
54 FileHeader:
55   Class:   ELFCLASS64
56   Data:    ELFDATA2LSB
57   Type:    ET_DYN
58   Machine: EM_X86_64
59 Sections:
60   - Name: .dynsym
61     Type: SHT_DYNSYM
62     Size: 0
64 ## Check we print symbol versions, when they are available.
65 ## A default version is one that is contained in the version table (SHT_GNU_versym)
66 ## and only available for defined symbols. Check we use the "@@" prefix to print it.
68 # RUN: yaml2obj --docnum=4 %s -o %t4-undef.o
69 # RUN: llvm-nm --dynamic %t4-undef.o 2>&1 | \
70 # RUN:   FileCheck %s -DFILE=%t4-undef.o -DTYPE=U \
71 # RUN:     --check-prefixes=VERSIONED-SYMS,VERSIONED-UNDEF-SYMS
73 # RUN: yaml2obj --docnum=4 -DINDEX=0x1 %s -o %t4-def.o
74 # RUN: llvm-nm --dynamic %t4-def.o 2>&1 | \
75 # RUN:   FileCheck %s -DFILE=%t4-def.o -DTYPE=r \
76 # RUN:     --check-prefixes=VERSIONED-SYMS,VERSIONED-DEF-SYMS
78 #            VERSIONED-SYMS: [[TYPE]] globalversym
79 #       VERSIONED-SYMS-NEXT: [[TYPE]] localversym
80 # VERSIONED-UNDEF-SYMS-NEXT: [[TYPE]] version2sym@v2
81 #   VERSIONED-DEF-SYMS-NEXT: [[TYPE]] version2sym@@v2
82 #       VERSIONED-SYMS-NEXT: [[TYPE]] version3sym@v3hidden
83 #       VERSIONED-SYMS-NEXT: [[TYPE]] version4sym@v4
84 #       VERSIONED-SYMS-NEXT: [[TYPE]] version5sym@v5hidden
86 --- !ELF
87 FileHeader:
88   Class: ELFCLASS64
89   Data:  ELFDATA2LSB
90   Type:  ET_DYN
91 Sections:
92   - Name:    .gnu.version
93     Type:    SHT_GNU_versym
94     Flags:   [ SHF_ALLOC ]
95 ## 0x8000 is a special VERSYM_HIDDEN bit.
96     Entries: [ 0, 0, 1, [[VERSYMENTRY=2]], 0x8003, 4, 0x8005 ]
97     ShSize:  [[VERSYMSIZE=<none>]]
98   - Name:         .gnu.version_d
99     Type:         SHT_GNU_verdef
100     Flags:        [ SHF_ALLOC ]
101     Link:         .dynstr
102     AddressAlign: 0x4
103     Info:         0x2
104     ShOffset:     [[VERDEFOFFSET=<none>]]
105     Entries:
106       - VersionNdx: 2
107         Names:
108           - v2
109       - VersionNdx: 3
110         Names:
111           - v3hidden
112   - Name:  .gnu.version_r
113     Type:  SHT_GNU_verneed
114     Flags: [ SHF_ALLOC ]
115     Link:  .dynstr
116     Info:  0x2
117     Dependencies:
118       - Version: 1
119         File:    file1.so
120         Entries:
121           - Name:  v4
122             Hash:  0
123             Flags: 0
124             Other: 4
125       - Version: 1
126         File:    file2.0
127         Entries:
128           - Name:  v5hidden
129             Hash:  0
130             Flags: 0
131             Other: 5
132   - Name:    .dynsym
133     Type:    SHT_DYNSYM
134     EntSize: [[ENTSIZE=<none>]]
135 DynamicSymbols:
136   - Name:  localversym
137     Index: [[INDEX=<none>]]
138   - Name:  globalversym
139     Index: [[INDEX=<none>]]
140   - Name:  version2sym
141     Index: [[INDEX=<none>]]
142   - Name:  version3sym
143     Index: [[INDEX=<none>]]
144   - Name:  version4sym
145     Index: [[INDEX=<none>]]
146   - Name:  version5sym
147     Index: [[INDEX=<none>]]
149 ## In the following cases we check we report warnings when unable to read symbol version.
150 ## Check that we still print unversioned symbol names.
152 ## Case 1: check we report a warning when unable to read symbol versions
153 ## from a broken SHT_GNU_verdef section. In this case its sh_offset
154 ## field has a too large value that goes past the EOF.
156 # RUN: yaml2obj --docnum=4 -DVERDEFOFFSET=0xffffffff %s -o %t4-broken-verdef.o
157 # RUN: llvm-nm --dynamic %t4-broken-verdef.o 2>&1 | \
158 # RUN:   FileCheck %s --check-prefixes=VERSION-ERR,VERSION-ERR1
160 # VERSION-ERR1: warning: unable to read symbol versions: cannot read content of SHT_GNU_verdef section with index 2: section [index 2] has a sh_offset (0xffffffff) + sh_size (0x38) that is greater than the file size (0x438)
161 # VERSION-ERR2: warning: unable to read symbol versions: unable to read an entry with index 1 from SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_size (255) which is not a multiple of its sh_entsize (2)
162 # VERSION-ERR3: warning: unable to read symbol versions: unable to get a version for entry 3 of SHT_GNU_versym section with index 1: SHT_GNU_versym section refers to a version index 255 which is missing
164 # VERSION-ERR-NEXT: U globalversym{{$}}
165 # VERSION-ERR-NEXT: U localversym{{$}}
166 # VERSION-ERR-NEXT: U version2sym{{$}}
167 # VERSION-ERR-NEXT: U version3sym{{$}}
168 # VERSION-ERR-NEXT: U version4sym{{$}}
169 # VERSION-ERR-NEXT: U version5sym{{$}}
171 ## Case 2: check we report a warning when we are unable to read a SHT_GNU_versym section entry.
172 ## In this case, the section has a size that is not a multiple of its sh_entsize.
174 # RUN: yaml2obj --docnum=4 -DVERSYMSIZE=0xff %s -o %t4-broken-versym.o
175 # RUN: llvm-nm --dynamic %t4-broken-versym.o 2>&1 | \
176 # RUN:   FileCheck %s --check-prefixes=VERSION-ERR,VERSION-ERR2
178 ## Case 3: check we report a warning when we are unable to get a version for a SHT_GNU_versym section entry.
179 ## In this case the SHT_GNU_versym section refers to a version index 255 which is missing.
181 # RUN: yaml2obj --docnum=4 -DVERSYMENTRY=0xff %s -o %t4-broken-index.o
182 # RUN: llvm-nm --dynamic %t4-broken-index.o 2>&1 | \
183 # RUN:   FileCheck %s --check-prefixes=VERSION-ERR,VERSION-ERR3
185 ## Case 4: check we report a warning when we are unable to get symbol flags.
186 ## In this case the dynamic symbol table has a wrong sh_entsize and we can't read a symbol.
188 # RUN: yaml2obj --docnum=4 -DENTSIZE=0xff %s -o %t4-broken-dynsym.o
189 # RUN: not llvm-nm --dynamic %t4-broken-dynsym.o 2>&1 | \
190 # RUN:   FileCheck %s -DFILE=%t4-broken-dynsym.o --check-prefix=VERSION-ERR4
192 # VERSION-ERR4: warning: unable to read symbol versions: unable to read flags for symbol with index 1: section [index 4] has invalid sh_entsize: expected 24, but got 255
193 # VERSION-ERR4: error: [[FILE]]: section [index 4] has invalid sh_entsize: expected 24, but got 255