1## In this test we test that dynamic symbols are dumped as expected. 2 3## Case 1: Dynamic symbol table found via the DT_SYMTAB dynamic tag. 4# RUN: yaml2obj --docnum=1 %s -o %t1.so 5# RUN: llvm-readobj --dyn-symbols %t1.so 2>&1 \ 6# RUN: | FileCheck %s --implicit-check-not="warning:" --check-prefix=DYNSYMS-LLVM 7# RUN: llvm-readelf --dyn-symbols %t1.so 2>&1 \ 8# RUN: | FileCheck %s --implicit-check-not="warning:" --check-prefix=DYNSYMS-GNU 9 10# DYNSYMS-LLVM: DynamicSymbols [ 11# DYNSYMS-LLVM-NEXT: Symbol { 12# DYNSYMS-LLVM-NEXT: Name: (0) 13# DYNSYMS-LLVM-NEXT: Value: 0x0 14# DYNSYMS-LLVM-NEXT: Size: 0 15# DYNSYMS-LLVM-NEXT: Binding: Local (0x0) 16# DYNSYMS-LLVM-NEXT: Type: None (0x0) 17# DYNSYMS-LLVM-NEXT: Other: 0 18# DYNSYMS-LLVM-NEXT: Section: Undefined (0x0) 19# DYNSYMS-LLVM-NEXT: } 20# DYNSYMS-LLVM-NEXT: Symbol { 21# DYNSYMS-LLVM-NEXT: Name: foo (5) 22# DYNSYMS-LLVM-NEXT: Value: 0x0 23# DYNSYMS-LLVM-NEXT: Size: 0 24# DYNSYMS-LLVM-NEXT: Binding: Local (0x0) 25# DYNSYMS-LLVM-NEXT: Type: None (0x0) 26# DYNSYMS-LLVM-NEXT: Other: 0 27# DYNSYMS-LLVM-NEXT: Section: Undefined (0x0) 28# DYNSYMS-LLVM-NEXT: } 29# DYNSYMS-LLVM-NEXT: Symbol { 30# DYNSYMS-LLVM-NEXT: Name: bar (1) 31# DYNSYMS-LLVM-NEXT: Value: 0x0 32# DYNSYMS-LLVM-NEXT: Size: 0 33# DYNSYMS-LLVM-NEXT: Binding: Local (0x0) 34# DYNSYMS-LLVM-NEXT: Type: None (0x0) 35# DYNSYMS-LLVM-NEXT: Other: 0 36# DYNSYMS-LLVM-NEXT: Section: Undefined (0x0) 37# DYNSYMS-LLVM-NEXT: } 38# DYNSYMS-LLVM-NEXT: ] 39 40# DYNSYMS-GNU: Symbol table '.dynsym' contains 3 entries: 41# DYNSYMS-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name 42# DYNSYMS-GNU-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 43# DYNSYMS-GNU-NEXT: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo 44# DYNSYMS-GNU-NEXT: 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND bar 45 46--- !ELF 47FileHeader: 48 Class: ELFCLASS64 49 Data: ELFDATA2LSB 50 Type: ET_DYN 51Sections: 52 - Name: .dynamic 53 Type: SHT_DYNAMIC 54 Entries: 55 - Tag: DT_SYMTAB 56 Value: 0x100 57 - Tag: DT_NULL 58 Value: 0 59 - Name: .dynsym 60 Type: SHT_DYNSYM 61 Address: 0x100 62DynamicSymbols: 63 - Name: foo 64 - Name: bar 65ProgramHeaders: 66 - Type: PT_LOAD 67 VAddr: 0x100 68 FirstSec: .dynsym 69 LastSec: .dynsym 70 71## Case 2: Check the output for aliases. 72## a) Check the two-letter alias --dt is equivalent to the --dyn-symbols 73## full flag name. 74# RUN: llvm-readobj --dt %t1.so > %t.readobj-dt-alias 75# RUN: llvm-readobj --dyn-symbols %t1.so > %t.readobj-dt-no-alias 76# RUN: cmp %t.readobj-dt-alias %t.readobj-dt-no-alias 77## b) Check --dyn-syms equals --dyn-symbols, --dt for llvm-readobj. 78# RUN: llvm-readobj --dyn-syms %t1.so > %t.readobj-dyn-syms 79# RUN: cmp %t.readobj-dt-alias %t.readobj-dyn-syms 80## c) Check --dyn-syms equals --dyn-symbols for llvm-readelf. 81# RUN: llvm-readelf --dyn-syms %t1.so > %t.readelf-dyn-syms 82# RUN: llvm-readelf --dyn-symbols %t1.so > %t.readelf-dyn-symbols 83# RUN: cmp %t.readelf-dyn-symbols %t.readelf-dyn-syms 84 85## Case 3.1: Check that we are able to dump the dynamic symbol table even when we have no program headers. 86## In this case we find the table by it's type (SHT_DYNSYM) and ignore the DT_SYMTAB value. 87# RUN: yaml2obj --docnum=2 %s -o %t2.so 88# RUN: llvm-readobj %t2.so --dyn-symbols 2>&1 | \ 89# RUN: FileCheck %s -DFILE=%t2.so --implicit-check-not=warning: --check-prefix=NOPHDRS-LLVM 90# RUN: llvm-readelf %t2.so --dyn-symbols 2>&1 | \ 91# RUN: FileCheck %s -DFILE=%t2.so --implicit-check-not=warning: -DNAME=.dynsym --check-prefix=NOPHDRS-GNU 92 93# NOPHDRS-LLVM: warning: '[[FILE]]': unable to parse DT_SYMTAB: virtual address is not in any segment: 0xffff1234 94# NOPHDRS-LLVM: DynamicSymbols [ 95# NOPHDRS-LLVM-NEXT: Symbol { 96# NOPHDRS-LLVM-NEXT: Name: (0) 97# NOPHDRS-LLVM-NEXT: Value: 0x0 98# NOPHDRS-LLVM-NEXT: Size: 0 99# NOPHDRS-LLVM-NEXT: Binding: Local (0x0) 100# NOPHDRS-LLVM-NEXT: Type: None (0x0) 101# NOPHDRS-LLVM-NEXT: Other: 0 102# NOPHDRS-LLVM-NEXT: Section: Undefined (0x0) 103# NOPHDRS-LLVM-NEXT: } 104# NOPHDRS-LLVM-NEXT: Symbol { 105# NOPHDRS-LLVM-NEXT: Name: foo (1) 106# NOPHDRS-LLVM-NEXT: Value: 0x0 107# NOPHDRS-LLVM-NEXT: Size: 0 108# NOPHDRS-LLVM-NEXT: Binding: Local (0x0) 109# NOPHDRS-LLVM-NEXT: Type: None (0x0) 110# NOPHDRS-LLVM-NEXT: Other: 0 111# NOPHDRS-LLVM-NEXT: Section: Undefined (0x0) 112# NOPHDRS-LLVM-NEXT: } 113# NOPHDRS-LLVM-NEXT: ] 114 115# NOPHDRS-GNU: warning: '[[FILE]]': unable to parse DT_SYMTAB: virtual address is not in any segment: 0xffff1234 116# NOPHDRS-NAMEWARN: warning: '[[FILE]]': unable to get the name of SHT_DYNSYM section with index 2: a section [index 2] has an invalid sh_name (0xffffffff) offset which goes past the end of the section name string table 117# NOPHDRS-GNU: Symbol table '[[NAME]]' contains 2 entries: 118# NOPHDRS-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name 119# NOPHDRS-GNU-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 120# NOPHDRS-GNU-NEXT: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo 121 122--- !ELF 123FileHeader: 124 Class: ELFCLASS64 125 Data: ELFDATA2LSB 126 Type: ET_DYN 127Sections: 128 - Name: .dynamic 129 Type: SHT_DYNAMIC 130 Entries: 131 - Tag: DT_SYMTAB 132 Value: 0xffff1234 133 - Tag: DT_NULL 134 Value: 0 135 - Name: .dynsym 136 Type: SHT_DYNSYM 137 ShName: [[DYNSYMNAME=<none>]] 138DynamicSymbols: 139 - Name: foo 140 141## Case 3.2: the same as 3.1, but the sh_name field of the SHT_DYNSYM section is invalid. 142## Check we are still able to dump symbols. 143# RUN: yaml2obj --docnum=2 -DDYNSYMNAME=0xffffffff %s -o %t2.broken.name 144# RUN: llvm-readobj %t2.broken.name --dyn-symbols 2>&1 | \ 145# RUN: FileCheck %s -DFILE=%t2.broken.name --check-prefix=NOPHDRS-LLVM --implicit-check-not=warning: 146# RUN: llvm-readelf %t2.broken.name --dyn-symbols 2>&1 | \ 147# RUN: FileCheck %s -DFILE=%t2.broken.name -DNAME="<?>" \ 148# RUN: --check-prefixes=NOPHDRS-GNU,NOPHDRS-NAMEWARN --implicit-check-not=warning: 149 150## Case 4: Check we report a warning when there is no SHT_DYNSYM section and we can't map the DT_SYMTAB value 151## to an address because of the absence of a corresponding PT_LOAD program header. 152# RUN: yaml2obj --docnum=3 %s -o %t3.so 153# RUN: llvm-readobj %t3.so --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t3.so --check-prefixes=NOSHT-DYNSYM,NOSHT-DYNSYM-LLVM 154# RUN: llvm-readelf %t3.so --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t3.so --check-prefix=NOSHT-DYNSYM 155 156# NOSHT-DYNSYM: warning: '[[FILE]]': unable to parse DT_SYMTAB: virtual address is not in any segment: 0x0 157# NOSHT-DYNSYM-LLVM: DynamicSymbols [ 158# NOSHT-DYNSYM-LLVM-NEXT: ] 159 160--- !ELF 161FileHeader: 162 Class: ELFCLASS64 163 Data: ELFDATA2LSB 164 Type: ET_DYN 165Sections: 166 - Name: .dynsym 167 Type: SHT_PROGBITS 168 - Name: .dynamic 169 Type: SHT_DYNAMIC 170 Entries: 171 - Tag: DT_SYMTAB 172 Value: 0 173 - Tag: DT_NULL 174 Value: 0 175DynamicSymbols: 176 - Name: foo 177 178## Case 5: Check that when we can't map the value of the DT_SYMTAB tag to an address, we report a warning and 179## use the information in the section header table to locate the dynamic symbol table. 180# RUN: yaml2obj --docnum=4 %s -o %t4.so 181# RUN: llvm-readobj %t4.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefixes=BROKEN-DTSYMTAB,BROKEN-DTSYMTAB-LLVM 182# RUN: llvm-readelf %t4.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefixes=BROKEN-DTSYMTAB,BROKEN-DTSYMTAB-GNU 183 184# BROKEN-DTSYMTAB: warning: '[[FILE]]': unable to parse DT_SYMTAB: virtual address is not in any segment: 0xffff1234 185# BROKEN-DTSYMTAB-LLVM: Name: foo 186# BROKEN-DTSYMTAB-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo 187 188--- !ELF 189FileHeader: 190 Class: ELFCLASS64 191 Data: ELFDATA2LSB 192 Type: ET_DYN 193Sections: 194 - Name: .dynamic 195 Type: SHT_DYNAMIC 196 Entries: 197 - Tag: DT_SYMTAB 198 Value: 0xffff1234 199 - Tag: DT_NULL 200 Value: 0 201DynamicSymbols: 202 - Name: foo 203ProgramHeaders: 204 - Type: PT_LOAD 205 VAddr: 0x0000 206 FirstSec: .dynsym 207 LastSec: .dynsym 208 209## Case 6: Check that if we can get the location of the dynamic symbol table using both the DT_SYMTAB value 210## and the section headers table then we prefer the former and report a warning. 211# RUN: yaml2obj --docnum=5 %s -o %t5.so 212# RUN: llvm-readobj %t5.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefixes=PREFER-DTSYMTAB,PREFER-DTSYMTAB-LLVM 213# RUN: llvm-readelf %t5.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefixes=PREFER-DTSYMTAB,PREFER-DTSYMTAB-GNU 214 215# PREFER-DTSYMTAB: warning: '[[FILE]]': SHT_DYNSYM section header and DT_SYMTAB disagree about the location of the dynamic symbol table 216# PREFER-DTSYMTAB-LLVM: Name: o 217# PREFER-DTSYMTAB-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND o 218 219--- !ELF 220FileHeader: 221 Class: ELFCLASS64 222 Data: ELFDATA2LSB 223 Type: ET_DYN 224Sections: 225 - Name: .dynamic 226 Type: SHT_DYNAMIC 227 Entries: 228 - Tag: DT_SYMTAB 229 Value: 0x0 230 - Tag: DT_NULL 231 Value: 0 232 - Name: .dynsym 233 Type: SHT_DYNSYM 234 - Name: .mydynsym 235 Type: SHT_DYNSYM 236## The Content describes 2 symbols: zero symbol and symbol with st_name == 3. 237 Content: "000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000" 238DynamicSymbols: 239 - Name: foo 240ProgramHeaders: 241 - Type: PT_LOAD 242 VAddr: 0x0000 243 FirstSec: .mydynsym 244 LastSec: .mydynsym 245 246## Case 7: Check how we dump versioned symbols. Use both -V and --dyn-symbols 247## to check that printed version is consistent. 248## A default version is one that is contained in the version table (SHT_GNU_versym) 249## and only available for defined symbols. We use the "@@" prefix to print it. 250 251## Check how we dump undefined symbols. 252 253# RUN: yaml2obj %s --docnum=6 -o %t6 254# RUN: llvm-readobj -V --dyn-symbols %t6 | FileCheck %s --check-prefix=VERSIONED-UND-LLVM 255# RUN: llvm-readelf -V --dyn-symbols %t6 | FileCheck %s --check-prefix=VERSIONED-UND-GNU 256 257# VERSIONED-UND-LLVM: DynamicSymbols [ 258# VERSIONED-UND-LLVM-NEXT: Symbol { 259# VERSIONED-UND-LLVM-NEXT: Name: (0) 260# VERSIONED-UND-LLVM-NEXT: Value: 0x0 261# VERSIONED-UND-LLVM-NEXT: Size: 0 262# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 263# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 264# VERSIONED-UND-LLVM-NEXT: Other: 0 265# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 266# VERSIONED-UND-LLVM-NEXT: } 267# VERSIONED-UND-LLVM-NEXT: Symbol { 268# VERSIONED-UND-LLVM-NEXT: Name: localversym (28) 269# VERSIONED-UND-LLVM-NEXT: Value: 0x0 270# VERSIONED-UND-LLVM-NEXT: Size: 0 271# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 272# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 273# VERSIONED-UND-LLVM-NEXT: Other: 0 274# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 275# VERSIONED-UND-LLVM-NEXT: } 276# VERSIONED-UND-LLVM-NEXT: Symbol { 277# VERSIONED-UND-LLVM-NEXT: Name: globalversym (40) 278# VERSIONED-UND-LLVM-NEXT: Value: 0x0 279# VERSIONED-UND-LLVM-NEXT: Size: 0 280# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 281# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 282# VERSIONED-UND-LLVM-NEXT: Other: 0 283# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 284# VERSIONED-UND-LLVM-NEXT: } 285# VERSIONED-UND-LLVM-NEXT: Symbol { 286# VERSIONED-UND-LLVM-NEXT: Name: aaa@v2 (65) 287# VERSIONED-UND-LLVM-NEXT: Value: 0x0 288# VERSIONED-UND-LLVM-NEXT: Size: 0 289# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 290# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 291# VERSIONED-UND-LLVM-NEXT: Other: 0 292# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 293# VERSIONED-UND-LLVM-NEXT: } 294# VERSIONED-UND-LLVM-NEXT: Symbol { 295# VERSIONED-UND-LLVM-NEXT: Name: bbb@v3hidden (61) 296# VERSIONED-UND-LLVM-NEXT: Value: 0x0 297# VERSIONED-UND-LLVM-NEXT: Size: 0 298# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 299# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 300# VERSIONED-UND-LLVM-NEXT: Other: 0 301# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 302# VERSIONED-UND-LLVM-NEXT: } 303# VERSIONED-UND-LLVM-NEXT: Symbol { 304# VERSIONED-UND-LLVM-NEXT: Name: ccc@v4 (57) 305# VERSIONED-UND-LLVM-NEXT: Value: 0x0 306# VERSIONED-UND-LLVM-NEXT: Size: 0 307# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 308# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 309# VERSIONED-UND-LLVM-NEXT: Other: 0 310# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 311# VERSIONED-UND-LLVM-NEXT: } 312# VERSIONED-UND-LLVM-NEXT: Symbol { 313# VERSIONED-UND-LLVM-NEXT: Name: ddd@v5hidden (53) 314# VERSIONED-UND-LLVM-NEXT: Value: 0x0 315# VERSIONED-UND-LLVM-NEXT: Size: 0 316# VERSIONED-UND-LLVM-NEXT: Binding: Local (0x0) 317# VERSIONED-UND-LLVM-NEXT: Type: None (0x0) 318# VERSIONED-UND-LLVM-NEXT: Other: 0 319# VERSIONED-UND-LLVM-NEXT: Section: Undefined (0x0) 320# VERSIONED-UND-LLVM-NEXT: } 321# VERSIONED-UND-LLVM-NEXT: ] 322# VERSIONED-UND-LLVM: VersionSymbols [ 323# VERSIONED-UND-LLVM: Name: localversym 324# VERSIONED-UND-LLVM: Name: globalversym 325# VERSIONED-UND-LLVM: Name: aaa@v2 326# VERSIONED-UND-LLVM: Name: bbb@v3hidden 327# VERSIONED-UND-LLVM: Name: ccc@v4 328# VERSIONED-UND-LLVM: Name: ddd@v5hidden 329 330# VERSIONED-UND-GNU: Num: Value Size Type Bind Vis Ndx Name 331# VERSIONED-UND-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND localversym 332# VERSIONED-UND-GNU-NEXT: 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND globalversym 333# VERSIONED-UND-GNU-NEXT: 3: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND aaa@v2 334# VERSIONED-UND-GNU-NEXT: 4: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND bbb@v3hidden 335# VERSIONED-UND-GNU-NEXT: 5: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND ccc@v4 336# VERSIONED-UND-GNU-NEXT: 6: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND ddd@v5hidden 337# VERSIONED-UND-GNU: 000: 0 (*local*) 0 (*local*) 1 (*global*) 2 (v2) 338# VERSIONED-UND-GNU: 004: 3h(v3hidden) 4 (v4) 5h(v5hidden) 339 340--- !ELF 341FileHeader: 342 Class: ELFCLASS64 343 Data: ELFDATA2LSB 344 Type: ET_DYN 345Sections: 346 - Name: .gnu.version 347 Type: SHT_GNU_versym 348 Flags: [ SHF_ALLOC ] 349 Link: .dynsym 350 AddressAlign: 0x2 351 EntSize: 0x2 352## 0x8000 is a special VERSYM_HIDDEN bit. 353## Here we have: VER_NDX_LOCAL (0), VER_NDX_GLOBAL (1), two versions 354## from the SHT_GNU_verdef section (2, 0x8003) and two versions 355## from the SHT_GNU_verneed section (4, 0x8005). 356 Entries: [ 0, 0, 1, 2, 0x8003, 4, 0x8005 ] 357 - Name: .gnu.version_d 358 Type: SHT_GNU_verdef 359 Flags: [ SHF_ALLOC ] 360 AddressAlign: 0x4 361 Entries: 362 - VersionNdx: 2 363 Names: 364 - v2 365 - VersionNdx: 3 366 Names: 367 - v3hidden 368 - Name: .gnu.version_r 369 Type: SHT_GNU_verneed 370 Flags: [ SHF_ALLOC ] 371 Dependencies: 372 - Version: 1 373 File: file1.so 374 Entries: 375 - Name: v4 376 Other: 4 377 Hash: 0 378 Flags: 0 379 - Version: 1 380 File: file2.0 381 Entries: 382 - Name: v5hidden 383 Other: 5 384 Hash: 0 385 Flags: 0 386DynamicSymbols: 387 - Name: localversym 388 Index: [[INDEX=<none>]] 389 - Name: globalversym 390 Index: [[INDEX=<none>]] 391 - Name: aaa 392 Index: [[INDEX=<none>]] 393 - Name: [[NAME=bbb]] 394 Type: [[TYPE=STT_NOTYPE]] 395 Index: [[INDEX_BBB=<none>]] 396 - Name: [[NAME=ccc]] 397 Type: [[TYPE=STT_NOTYPE]] 398 Index: [[INDEX=<none>]] 399 - Name: ddd 400 Index: [[INDEX=<none>]] 401 402## In this case all dynamic symbols are defined. Check that we print the 403## "@@" prefix for default versions as expected. 404 405# RUN: yaml2obj %s --docnum=6 -DINDEX=1 -DINDEX_BBB=1 -o %t6.def 406# RUN: llvm-readobj -V --dyn-symbols %t6.def | FileCheck %s --check-prefix=VERSIONED-DEF-LLVM 407# RUN: llvm-readelf -V --dyn-symbols %t6.def | FileCheck %s --check-prefix=VERSIONED-DEF-GNU 408 409# VERSIONED-DEF-LLVM: DynamicSymbols [ 410# VERSIONED-DEF-LLVM: Symbol { 411# VERSIONED-DEF-LLVM: Name: localversym (28) 412# VERSIONED-DEF-LLVM: Section: .gnu.version (0x1) 413# VERSIONED-DEF-LLVM-NEXT: } 414# VERSIONED-DEF-LLVM-NEXT: Symbol { 415# VERSIONED-DEF-LLVM-NEXT: Name: globalversym (40) 416# VERSIONED-DEF-LLVM: Section: .gnu.version (0x1) 417# VERSIONED-DEF-LLVM-NEXT: } 418# VERSIONED-DEF-LLVM-NEXT: Symbol { 419# VERSIONED-DEF-LLVM-NEXT: Name: aaa@@v2 (65) 420# VERSIONED-DEF-LLVM: Section: .gnu.version (0x1) 421# VERSIONED-DEF-LLVM-NEXT: } 422# VERSIONED-DEF-LLVM-NEXT: Symbol { 423# VERSIONED-DEF-LLVM-NEXT: Name: bbb@v3hidden (61) 424# VERSIONED-DEF-LLVM: Section: .gnu.version (0x1) 425# VERSIONED-DEF-LLVM-NEXT: } 426# VERSIONED-DEF-LLVM-NEXT: Symbol { 427# VERSIONED-DEF-LLVM-NEXT: Name: ccc@v4 (57) 428# VERSIONED-DEF-LLVM: Section: .gnu.version (0x1) 429# VERSIONED-DEF-LLVM-NEXT: } 430# VERSIONED-DEF-LLVM-NEXT: Symbol { 431# VERSIONED-DEF-LLVM-NEXT: Name: ddd@v5hidden (53) 432# VERSIONED-DEF-LLVM: Section: .gnu.version (0x1) 433# VERSIONED-DEF-LLVM-NEXT: } 434# VERSIONED-DEF-LLVM: VersionSymbols [ 435# VERSIONED-DEF-LLVM: Name: localversym 436# VERSIONED-DEF-LLVM: Name: globalversym 437# VERSIONED-DEF-LLVM: Name: aaa@@v2 438# VERSIONED-DEF-LLVM: Name: bbb@v3hidden 439# VERSIONED-DEF-LLVM: Name: ccc@v4 440# VERSIONED-DEF-LLVM: Name: ddd@v5hidden 441 442# VERSIONED-DEF-GNU: Num: {{.*}} Vis Ndx Name 443# VERSIONED-DEF-GNU: 1: {{.*}} DEFAULT 1 localversym 444# VERSIONED-DEF-GNU-NEXT: 2: {{.*}} DEFAULT 1 globalversym 445# VERSIONED-DEF-GNU-NEXT: 3: {{.*}} DEFAULT 1 aaa@@v2 446# VERSIONED-DEF-GNU-NEXT: 4: {{.*}} DEFAULT 1 bbb@v3hidden 447# VERSIONED-DEF-GNU-NEXT: 5: {{.*}} DEFAULT 1 ccc@v4 448# VERSIONED-DEF-GNU-NEXT: 6: {{.*}} DEFAULT 1 ddd@v5hidden 449 450## Check the behavior for unnamed versioned section symbols. 451# RUN: yaml2obj %s -DTYPE=STT_SECTION -DNAME="''" -DINDEX_BBB=SHN_ABS --docnum=6 -o %t6.sec.sym 452# RUN: llvm-readobj -V --dyn-symbols %t6.sec.sym 2>&1 | \ 453# RUN: FileCheck %s -DFILE=%t6.sec.sym --check-prefix=VERSIONED-SEC-SYM-LLVM 454# RUN: llvm-readelf -V --dyn-symbols %t6.sec.sym 2>&1 | \ 455# RUN: FileCheck %s -DFILE=%t6.sec.sym --check-prefix=VERSIONED-SEC-SYM-GNU 456 457# VERSIONED-SEC-SYM-LLVM: DynamicSymbols [ 458# VERSIONED-SEC-SYM-LLVM: Name: localversym (28) 459# VERSIONED-SEC-SYM-LLVM: Name: globalversym (40) 460# VERSIONED-SEC-SYM-LLVM: Name: aaa@v2 (57) 461# VERSIONED-SEC-SYM-LLVM: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff1 (SHN_ABS) 462# VERSIONED-SEC-SYM-LLVM: Name: <?> (0) 463# VERSIONED-SEC-SYM-LLVM: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0x0 (SHN_UNDEF) 464# VERSIONED-SEC-SYM-LLVM: Name: <?> (0) 465# VERSIONED-SEC-SYM-LLVM: Name: ddd@v5hidden (53) 466# VERSIONED-SEC-SYM-LLVM: VersionSymbols [ 467# VERSIONED-SEC-SYM-LLVM: Name: localversym 468# VERSIONED-SEC-SYM-LLVM: Name: globalversym 469# VERSIONED-SEC-SYM-LLVM: Name: aaa@v2 470# VERSIONED-SEC-SYM-LLVM: Name: <?> 471# VERSIONED-SEC-SYM-LLVM: Name: <?> 472# VERSIONED-SEC-SYM-LLVM: Name: ddd@v5hidden 473 474# VERSIONED-SEC-SYM-GNU: Symbol table '.dynsym' contains 7 entries: 475# VERSIONED-SEC-SYM-GNU: Num: {{.*}} Ndx Name 476# VERSIONED-SEC-SYM-GNU: 1: {{.*}} UND localversym 477# VERSIONED-SEC-SYM-GNU-NEXT: 2: {{.*}} UND globalversym 478# VERSIONED-SEC-SYM-GNU-NEXT: 3: {{.*}} UND aaa@v2 479# VERSIONED-SEC-SYM-GNU-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff1 (SHN_ABS) 480# VERSIONED-SEC-SYM-GNU-NEXT: 4: {{.*}} ABS <?> 481# VERSIONED-SEC-SYM-GNU-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0x0 (SHN_UNDEF) 482# VERSIONED-SEC-SYM-GNU-NEXT: 5: {{.*}} UND <?> 483# VERSIONED-SEC-SYM-GNU-NEXT: 6: {{.*}} UND ddd@v5hidden 484 485## Check we print a proper warning when an unnamed versioned section symbol has st_shndx = SHN_XINDEX, but there 486## is no SHT_SYMTAB_SHNDX section in the object. 487# RUN: yaml2obj %s -DTYPE=STT_SECTION -DNAME="''" -DINDEX_BBB=SHN_XINDEX --docnum=6 -o %t6.sec.xindex.sym 488# RUN: llvm-readobj -V --dyn-symbols %t6.sec.xindex.sym 2>&1 | \ 489# RUN: FileCheck %s -DFILE=%t6.sec.xindex.sym --check-prefix=VERSIONED-SEC-SYM-XINDEX-LLVM 490# RUN: llvm-readelf -V --dyn-symbols %t6.sec.xindex.sym 2>&1 | \ 491# RUN: FileCheck %s -DFILE=%t6.sec.xindex.sym --check-prefix=VERSIONED-SEC-SYM-XINDEX-GNU 492 493# VERSIONED-SEC-SYM-XINDEX-LLVM: Name: aaa@v2 (57) 494# VERSIONED-SEC-SYM-XINDEX-LLVM: warning: '[[FILE]]': found an extended symbol index (4), but unable to locate the extended symbol index table 495# VERSIONED-SEC-SYM-XINDEX-LLVM-NEXT: Symbol { 496# VERSIONED-SEC-SYM-XINDEX-LLVM-NEXT: Name: <?> (0) 497 498# VERSIONED-SEC-SYM-XINDEX-GNU: 3: {{.*}} UND aaa@v2 499# VERSIONED-SEC-SYM-XINDEX-GNU-NEXT: warning: '[[FILE]]': found an extended symbol index (4), but unable to locate the extended symbol index table 500# VERSIONED-SEC-SYM-XINDEX-GNU-NEXT: 4: {{.*}} RSV[0xffff] <?> 501 502## Case 8: Check what we print when: 503## a) The dynamic symbol table does not exist. 504# RUN: yaml2obj %s --docnum=7 -o %t7 505# RUN: llvm-readobj --dyn-symbols %t7 | FileCheck %s --check-prefix=NO-DYNSYM-LLVM 506# RUN: llvm-readelf --dyn-symbols %t7 | count 0 507## b) The dynamic symbol table has a size of 0. 508# RUN: yaml2obj %s --docnum=8 -o %t8 509# RUN: llvm-readobj --dyn-symbols %t8 | FileCheck %s --check-prefix=NO-DYNSYM-LLVM 510# RUN: llvm-readelf --dyn-symbols %t8 | count 0 511## c) The dynamic symbol table only contains the null symbol. 512# RUN: yaml2obj %s --docnum=9 -o %t9 513# RUN: llvm-readobj --dyn-symbols %t9 | FileCheck %s --check-prefix=DYNSYM-EMPTY-LLVM 514# RUN: llvm-readelf --dyn-symbols %t9 | FileCheck %s --check-prefix=DYNSYM-EMPTY-GNU 515 516# NO-DYNSYM-LLVM: DynamicSymbols [ 517# NO-DYNSYM-LLVM-NEXT: ] 518 519# DYNSYM-EMPTY-LLVM: DynamicSymbols [ 520# DYNSYM-EMPTY-LLVM-NEXT: Symbol { 521# DYNSYM-EMPTY-LLVM-NEXT: Name: (0) 522# DYNSYM-EMPTY-LLVM-NEXT: Value: 0x0 523# DYNSYM-EMPTY-LLVM-NEXT: Size: 0 524# DYNSYM-EMPTY-LLVM-NEXT: Binding: Local (0x0) 525# DYNSYM-EMPTY-LLVM-NEXT: Type: None (0x0) 526# DYNSYM-EMPTY-LLVM-NEXT: Other: 0 527# DYNSYM-EMPTY-LLVM-NEXT: Section: Undefined (0x0) 528# DYNSYM-EMPTY-LLVM-NEXT: } 529# DYNSYM-EMPTY-LLVM-NEXT: ] 530 531# DYNSYM-EMPTY-GNU: Symbol table '.dynsym' contains 1 entries: 532# DYNSYM-EMPTY-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name 533# DYNSYM-EMPTY-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 534 535--- !ELF 536FileHeader: 537 Class: ELFCLASS32 538 Data: ELFDATA2LSB 539 Type: ET_DYN 540 541--- !ELF 542FileHeader: 543 Class: ELFCLASS32 544 Data: ELFDATA2LSB 545 Type: ET_DYN 546Sections: 547 - Name: .dynsym 548 Type: SHT_DYNSYM 549 Size: 0 550 551--- !ELF 552FileHeader: 553 Class: ELFCLASS32 554 Data: ELFDATA2LSB 555 Type: ET_DYN 556DynamicSymbols: [] 557 558## Case 9: Check what we print when: 559## a) The size of the dynamic symbol table is not a multiple of its entry size. 560# RUN: yaml2obj %s --docnum=10 -o %t10 561# RUN: llvm-readobj --dyn-symbols %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=DYNSYM-SIZE-INVALID1 562# RUN: llvm-readelf --dyn-symbols %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=DYNSYM-SIZE-INVALID1 563 564# DYNSYM-SIZE-INVALID1: warning: '[[FILE]]': SHT_DYNSYM section with index 1 has invalid size (0x1) or entry size (0x10) 565 566## b) The same, but the DT_SYMTAB tag is present. In this case the dynamic tag has priority over the 567## information about a location and an entity size of the dynamic symbol table from the section header. 568## The code uses sizeof(Elf_Sym) for an entity size, so it can't be incorrect and 569## the message printed is a bit shorter. 570# RUN: yaml2obj %s --docnum=11 -o %t11 571# RUN: llvm-readobj --dyn-symbols %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=DYNSYM-SIZE-INVALID2 572# RUN: llvm-readelf --dyn-symbols %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=DYNSYM-SIZE-INVALID2 573 574# DYNSYM-SIZE-INVALID2: warning: '[[FILE]]': SHT_DYNSYM section with index 2 has invalid size (0x1){{$}} 575 576## c) In the case when the DT_SYMENT tag is present, we report when it's value does not match the 577# value of the symbol size for the platform. 578# RUN: yaml2obj %s -D BITS=32 --docnum=12 -o %t12 579# RUN: llvm-readobj --dyn-symbols %t12 2>&1 | \ 580# RUN: FileCheck %s -DFILE=%t12 --implicit-check-not=warning: --check-prefix=DYNSYM-SIZE-INVALID3 581# RUN: llvm-readelf --dyn-symbols %t12 2>&1 | \ 582# RUN: FileCheck %s -DFILE=%t12 --implicit-check-not=warning: --check-prefix=DYNSYM-SIZE-INVALID3 583# RUN: yaml2obj %s -D BITS=64 --docnum=12 -o %t13 584# RUN: llvm-readobj --dyn-symbols %t13 2>&1 | \ 585# RUN: FileCheck %s -DFILE=%t13 --implicit-check-not=warning: --check-prefix=DYNSYM-SIZE-INVALID4 586# RUN: llvm-readelf --dyn-symbols %t13 2>&1 | \ 587# RUN: FileCheck %s -DFILE=%t13 --implicit-check-not=warning: --check-prefix=DYNSYM-SIZE-INVALID4 588 589# DYNSYM-SIZE-INVALID3: warning: '[[FILE]]': DT_SYMENT value of 0x123 is not the size of a symbol (0x10){{$}} 590# DYNSYM-SIZE-INVALID4: warning: '[[FILE]]': DT_SYMENT value of 0x123 is not the size of a symbol (0x18){{$}} 591 592--- !ELF 593FileHeader: 594 Class: ELFCLASS32 595 Data: ELFDATA2LSB 596 Type: ET_DYN 597Sections: 598 - Name: .dynsym 599 Type: SHT_DYNSYM 600 Size: 0x1 601 602--- !ELF 603FileHeader: 604 Class: ELFCLASS64 605 Data: ELFDATA2LSB 606 Type: ET_DYN 607Sections: 608 - Name: .dynamic 609 Type: SHT_DYNAMIC 610 Entries: 611 - Tag: DT_SYMTAB 612 Value: 0x100 613 - Tag: DT_NULL 614 Value: 0 615 - Name: .dynsym 616 Type: SHT_DYNSYM 617 Address: 0x100 618 Size: 0x1 619ProgramHeaders: 620 - Type: PT_LOAD 621 VAddr: 0x100 622 FirstSec: .dynsym 623 LastSec: .dynsym 624 625--- !ELF 626FileHeader: 627 Class: ELFCLASS[[BITS]] 628 Data: ELFDATA2LSB 629 Type: ET_DYN 630Sections: 631 - Name: .dynamic 632 Type: SHT_DYNAMIC 633 Entries: 634 - Tag: DT_SYMENT 635 Value: 0x123 636 - Tag: DT_SYMENT 637 Value: 0x123 638 - Tag: DT_NULL 639 Value: 0 640 641## Case 10: Check we report a warning when the DT_STRSZ value is broken so that the dynamic string 642## table goes past the end of the file. Document we stop dumping symbols and report an error. 643 644# RUN: yaml2obj %s --docnum=13 -o %t14 645# RUN: llvm-readobj --dyn-symbols %t14 2>&1 | \ 646# RUN: FileCheck %s -DFILE=%t14 --check-prefix=DYNSTR-INVALID-LLVM 647# RUN: llvm-readelf --dyn-symbols %t14 2>&1 | \ 648# RUN: FileCheck %s -DFILE=%t14 --check-prefix=DYNSTR-INVALID-GNU 649 650# DYNSTR-INVALID-LLVM: warning: '[[FILE]]': the dynamic string table at 0x78 goes past the end of the file (0x2a8) with DT_STRSZ = 0xffffffff 651# DYNSTR-INVALID-LLVM: DynamicSymbols [ 652# DYNSTR-INVALID-LLVM-NEXT: Symbol { 653# DYNSTR-INVALID-LLVM-NEXT: Name: (0) 654# DYNSTR-INVALID-LLVM-NEXT: Value: 0x0 655# DYNSTR-INVALID-LLVM-NEXT: Size: 0 656# DYNSTR-INVALID-LLVM-NEXT: Binding: Local (0x0) 657# DYNSTR-INVALID-LLVM-NEXT: Type: None (0x0) 658# DYNSTR-INVALID-LLVM-NEXT: Other: 0 659# DYNSTR-INVALID-LLVM-NEXT: Section: Undefined (0x0) 660# DYNSTR-INVALID-LLVM-NEXT: } 661# DYNSTR-INVALID-LLVM-NEXT: warning: '[[FILE]]': st_name (0xffffff00) is past the end of the string table of size 0x6 662# DYNSTR-INVALID-LLVM-NEXT: Symbol { 663# DYNSTR-INVALID-LLVM-NEXT: Name: <?> (4294967040) 664# DYNSTR-INVALID-LLVM-NEXT: Value: 0x0 665# DYNSTR-INVALID-LLVM-NEXT: Size: 0 666# DYNSTR-INVALID-LLVM-NEXT: Binding: Local (0x0) 667# DYNSTR-INVALID-LLVM-NEXT: Type: None (0x0) 668# DYNSTR-INVALID-LLVM-NEXT: Other: 0 669# DYNSTR-INVALID-LLVM-NEXT: Section: Undefined (0x0) 670# DYNSTR-INVALID-LLVM-NEXT: } 671# DYNSTR-INVALID-LLVM-NEXT: Symbol { 672# DYNSTR-INVALID-LLVM-NEXT: Name: test (1) 673# DYNSTR-INVALID-LLVM-NEXT: Value: 0x0 674# DYNSTR-INVALID-LLVM-NEXT: Size: 0 675# DYNSTR-INVALID-LLVM-NEXT: Binding: Local (0x0) 676# DYNSTR-INVALID-LLVM-NEXT: Type: None (0x0) 677# DYNSTR-INVALID-LLVM-NEXT: Other: 0 678# DYNSTR-INVALID-LLVM-NEXT: Section: Undefined (0x0) 679# DYNSTR-INVALID-LLVM-NEXT: } 680# DYNSTR-INVALID-LLVM-NEXT: ] 681 682# DYNSTR-INVALID-GNU: warning: '[[FILE]]': the dynamic string table at 0x78 goes past the end of the file (0x2a8) with DT_STRSZ = 0xffffffff 683# DYNSTR-INVALID-GNU: Symbol table '.dynsym' contains 3 entries: 684# DYNSTR-INVALID-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name 685# DYNSTR-INVALID-GNU-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 686# DYNSTR-INVALID-GNU-NEXT: warning: '[[FILE]]': st_name (0xffffff00) is past the end of the string table of size 0x6 687# DYNSTR-INVALID-GNU-NEXT: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND <?> 688# DYNSTR-INVALID-GNU-NEXT: 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND test 689 690--- !ELF 691FileHeader: 692 Class: ELFCLASS64 693 Data: ELFDATA2LSB 694 Type: ET_EXEC 695Sections: 696 - Name: .dynstr 697 Type: SHT_STRTAB 698 Flags: [ SHF_ALLOC ] 699 Content: '007465737400' ## '\0', 'test', '\0' 700 - Name: .dynamic 701 Type: SHT_DYNAMIC 702 Flags: [ SHF_ALLOC ] 703 Link: .dynstr 704 Entries: 705 - Tag: DT_STRTAB 706 Value: 0x0 707 - Tag: DT_STRSZ 708 Value: 0xffffffff 709 - Tag: DT_NULL 710 Value: 0x0 711DynamicSymbols: 712 - StName: 0xffffff00 713## An arbitrary valid symbol to document we report an error before dumping it. 714 - StName: 0x1 715ProgramHeaders: 716 - Type: PT_LOAD 717 Flags: [ PF_R ] 718 FirstSec: .dynstr 719 LastSec: .dynamic 720 721## Case 11: check various warnings we report when fields of the SHT_DYNSYM section are broken. 722 723## a) check we report a warning when the entry size of the dynamic symbol table is zero. 724# RUN: yaml2obj %s --docnum=14 -DENTSIZE=0x0 -o %t15.entsize 725# RUN: llvm-readobj --dyn-symbols %t15.entsize 2>&1 | FileCheck %s -DFILE=%t15.entsize --check-prefix=DYNSYM-ZERO-ENTSIZE-LLVM 726# RUN: llvm-readelf --dyn-symbols %t15.entsize 2>&1 | \ 727# RUN: FileCheck %s -DFILE=%t15.entsize --check-prefix=DYNSYM-ZERO-ENTSIZE-GNU --implicit-check-not="Symbol table" 728 729# DYNSYM-ZERO-ENTSIZE-LLVM: DynamicSymbols [ 730# DYNSYM-ZERO-ENTSIZE-LLVM-NEXT: warning: '[[FILE]]': SHT_DYNSYM section with index 1 has invalid size (0x20) or entry size (0x0) 731# DYNSYM-ZERO-ENTSIZE-LLVM-NEXT: ] 732 733# DYNSYM-ZERO-ENTSIZE-GNU: warning: '[[FILE]]': SHT_DYNSYM section with index 1 has invalid size (0x20) or entry size (0x0) 734 735--- !ELF 736FileHeader: 737 Class: ELFCLASS32 738 Data: ELFDATA2LSB 739 Type: ET_DYN 740Sections: 741 - Name: .dynsym 742 Type: SHT_DYNSYM 743 EntSize: [[ENTSIZE=<none>]] 744 Link: [[LINK=<none>]] 745 ShOffset: [[OFFSET=<none>]] 746 ShSize: [[SIZE=<none>]] 747DynamicSymbols: 748 - Name: foo 749 750## b) check we report a warning when the sh_offset field of the SHT_DYNSYM section is 751## invalid (sh_offset + sh_size is greater than the file size). Check we don't dump 752## dynamic symbols in this case. 753# RUN: yaml2obj --docnum=14 %s -DOFFSET=0xffffffff -o %t15.offset 754# RUN: llvm-readobj %t15.offset --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t15.offset \ 755# RUN: --check-prefixes=OFFSET-BROKEN,OFFSET-BROKEN-LLVM 756# RUN: llvm-readelf %t15.offset --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t15.offset \ 757# RUN: --implicit-check-not="Symbol table" --check-prefix=OFFSET-BROKEN 758 759# OFFSET-BROKEN: warning: '[[FILE]]': unable to read dynamic symbols from SHT_DYNSYM section with index 1: offset (0xffffffff) + size (0x20) is greater than the file size (0x148) 760 761# OFFSET-BROKEN-LLVM: DynamicSymbols [ 762# OFFSET-BROKEN-LLVM-NEXT: ] 763 764## c) check we report a warning when the sh_size field of the SHT_DYNSYM section is 765## invalid (sh_offset + sh_size is greater than the file size). Check we don't dump 766## dynamic symbols in this case. 767# RUN: yaml2obj --docnum=14 %s -DSIZE=0xffffffff -o %t15.size 768# RUN: llvm-readobj %t15.size --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t15.size \ 769# RUN: --check-prefixes=SIZE-BROKEN,SIZE-BROKEN-LLVM 770# RUN: llvm-readelf %t15.size --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t15.size \ 771# RUN: --implicit-check-not="Symbol table" --check-prefix=SIZE-BROKEN 772 773# SIZE-BROKEN: warning: '[[FILE]]': unable to read dynamic symbols from SHT_DYNSYM section with index 1: offset (0x34) + size (0xffffffff) is greater than the file size (0x148) 774 775# SIZE-BROKEN-LLVM: DynamicSymbols [ 776# SIZE-BROKEN-LLVM-NEXT: ] 777 778## d) check we report a warning when the sh_link field of the SHT_DYNSYM section 779## is not a valid section index or is not an index of a valid string table. 780# RUN: yaml2obj --docnum=14 %s -DLINK=0xffffffff -o %t16.link 781# RUN: llvm-readobj %t16.link --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \ 782# RUN: --check-prefixes=LINK-BROKEN1,LINK-BROKEN-LLVM --implicit-check-not=warning: 783# RUN: llvm-readelf %t16.link --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \ 784# RUN: --check-prefixes=LINK-BROKEN1,LINK-BROKEN-GNU --implicit-check-not=warning: 785 786## Also test that we are able to dump section headers even if the .dynsym section's sh_link field is broken. 787# RUN: llvm-readobj %t16.link --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \ 788# RUN: --check-prefixes=LINK-BROKEN1,LINK-SEC-HDRS-LLVM,LINK-BROKEN-LLVM --implicit-check-not=warning: 789# RUN: llvm-readelf %t16.link --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link \ 790# RUN: --check-prefixes=LINK-BROKEN1,LINK-SEC-HDRS-GNU,LINK-BROKEN-GNU 791 792# RUN: yaml2obj --docnum=14 %s -DLINK=0x0 -o %t16.link.0 793# RUN: llvm-readobj %t16.link.0 --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \ 794# RUN: --check-prefixes=LINK-BROKEN2,LINK-BROKEN-LLVM --implicit-check-not=warning: 795# RUN: llvm-readelf %t16.link.0 --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \ 796# RUN: --check-prefixes=LINK-BROKEN2,LINK-BROKEN-GNU --implicit-check-not=warning: 797 798## Also test that we are able to dump section headers even if the .dynsym section's sh_link field is broken. 799# RUN: llvm-readobj %t16.link.0 --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \ 800# RUN: --check-prefixes=LINK-BROKEN2,LINK-SEC-HDRS-LLVM,LINK-BROKEN-LLVM --implicit-check-not=warning: 801# RUN: llvm-readelf %t16.link.0 --section-headers --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t16.link.0 \ 802# RUN: --check-prefixes=LINK-BROKEN2,LINK-SEC-HDRS-GNU,LINK-BROKEN-GNU --implicit-check-not=warning: 803 804# LINK-BROKEN1: warning: '[[FILE]]': unable to get the string table for the SHT_DYNSYM section with index 1: invalid section index: 4294967295 805# LINK-BROKEN2: warning: '[[FILE]]': unable to get the string table for the SHT_DYNSYM section with index 1: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL 806 807# LINK-SEC-HDRS-LLVM: Sections [ 808# LINK-SEC-HDRS-GNU: There are 5 section headers, starting at offset 0x80: 809 810# LINK-BROKEN-LLVM: DynamicSymbols [ 811# LINK-BROKEN-LLVM-NEXT: warning: '[[FILE]]': st_name (0x0) is past the end of the string table of size 0x0 812# LINK-BROKEN-LLVM-NEXT: Symbol { 813# LINK-BROKEN-LLVM-NEXT: Name: <?> (0) 814# LINK-BROKEN-LLVM-NEXT: Value: 0x0 815# LINK-BROKEN-LLVM-NEXT: Size: 0 816# LINK-BROKEN-LLVM-NEXT: Binding: Local (0x0) 817# LINK-BROKEN-LLVM-NEXT: Type: None (0x0) 818# LINK-BROKEN-LLVM-NEXT: Other: 0 819# LINK-BROKEN-LLVM-NEXT: Section: Undefined (0x0) 820# LINK-BROKEN-LLVM-NEXT: } 821# LINK-BROKEN-LLVM-NEXT: warning: '[[FILE]]': st_name (0x1) is past the end of the string table of size 0x0 822# LINK-BROKEN-LLVM-NEXT: Symbol { 823# LINK-BROKEN-LLVM-NEXT: Name: <?> (1) 824# LINK-BROKEN-LLVM-NEXT: Value: 0x0 825# LINK-BROKEN-LLVM-NEXT: Size: 0 826# LINK-BROKEN-LLVM-NEXT: Binding: Local (0x0) 827# LINK-BROKEN-LLVM-NEXT: Type: None (0x0) 828# LINK-BROKEN-LLVM-NEXT: Other: 0 829# LINK-BROKEN-LLVM-NEXT: Section: Undefined (0x0) 830# LINK-BROKEN-LLVM-NEXT: } 831# LINK-BROKEN-LLVM-NEXT: ] 832 833# LINK-BROKEN-GNU: Symbol table '.dynsym' contains 2 entries: 834# LINK-BROKEN-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name 835# LINK-BROKEN-GNU-NEXT: warning: '[[FILE]]': st_name (0x0) is past the end of the string table of size 0x0 836# LINK-BROKEN-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND <?> 837# LINK-BROKEN-GNU-NEXT: warning: '[[FILE]]': st_name (0x1) is past the end of the string table of size 0x0 838# LINK-BROKEN-GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT UND <?> 839