| ## This is a test for --dynamic/-D option. | 
 |  | 
 | ## Test llvm-nm dumping ELF file with valid .dynsym section. | 
 | # RUN: yaml2obj --docnum=1 %s -o %t1.o | 
 | # RUN: llvm-nm --dynamic %t1.o | \ | 
 | # RUN:   FileCheck %s --match-full-lines --strict-whitespace --check-prefix DYNSYM | 
 | # RUN: llvm-nm -D %t1.o | \ | 
 | # RUN:   FileCheck %s --match-full-lines --strict-whitespace --check-prefix DYNSYM | 
 |  | 
 | #       DYNSYM:                 U globalsym | 
 | #  DYNSYM-NEXT:                 U localsym1 | 
 | #  DYNSYM-NEXT:0000000000000000 n localsym2 | 
 | # DYNSYM-EMPTY: | 
 |  | 
 | --- !ELF | 
 | FileHeader: | 
 |   Class:   ELFCLASS64 | 
 |   Data:    ELFDATA2LSB | 
 |   Type:    ET_DYN | 
 |   Machine: EM_X86_64 | 
 | Sections: | 
 |   - Name: section | 
 |     Type: SHT_PROGBITS | 
 | DynamicSymbols: | 
 |   - Name:    localsym1 | 
 |     Type:    STT_OBJECT | 
 |   - Name:    localsym2 | 
 |     Section: section | 
 |   - Name:    globalsym | 
 |     Type:    STT_OBJECT | 
 |     Binding: STB_GLOBAL | 
 |  | 
 | ## Test llvm-nm dumping ELF file without a .dynsym section. | 
 | # RUN: yaml2obj --docnum=2 %s -o %t2.o | 
 | # RUN: llvm-nm --dynamic %t2.o 2>&1 | \ | 
 | # RUN:   FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t2.o --check-prefix NO-SYMS | 
 |  | 
 | #       NO-SYMS:[[FILE]]: no symbols | 
 | # NO-SYMS-EMPTY: | 
 |  | 
 | --- !ELF | 
 | FileHeader: | 
 |   Class:   ELFCLASS64 | 
 |   Data:    ELFDATA2LSB | 
 |   Type:    ET_DYN | 
 |   Machine: EM_X86_64 | 
 |  | 
 | ## Test llvm-nm dumping ELF file with an empty .dynsym section. | 
 | # RUN: yaml2obj --docnum=3 %s -o %t3.o | 
 | # RUN: llvm-nm --dynamic %t3.o 2>&1 | \ | 
 | # RUN:   FileCheck %s --match-full-lines --strict-whitespace -DFILE=%t3.o --check-prefix NO-SYMS | 
 |  | 
 | --- !ELF | 
 | FileHeader: | 
 |   Class:   ELFCLASS64 | 
 |   Data:    ELFDATA2LSB | 
 |   Type:    ET_DYN | 
 |   Machine: EM_X86_64 | 
 | Sections: | 
 |   - Name: .dynsym | 
 |     Type: SHT_DYNSYM | 
 |     Size: 0 | 
 |  | 
 | ## Check we print symbol versions, when they are available. | 
 | ## A default version is one that is contained in the version table (SHT_GNU_versym) | 
 | ## and only available for defined symbols. Check we use the "@@" prefix to print it. | 
 |  | 
 | # RUN: yaml2obj --docnum=4 %s -o %t4-undef.o | 
 | # RUN: llvm-nm --dynamic %t4-undef.o 2>&1 | \ | 
 | # RUN:   FileCheck %s -DFILE=%t4-undef.o -DTYPE=U \ | 
 | # RUN:     --check-prefixes=VERSIONED-SYMS,VERSIONED-UNDEF-SYMS | 
 |  | 
 | # RUN: yaml2obj --docnum=4 -DINDEX=0x1 %s -o %t4-def.o | 
 | # RUN: llvm-nm --dynamic %t4-def.o 2>&1 | \ | 
 | # RUN:   FileCheck %s -DFILE=%t4-def.o -DTYPE=r \ | 
 | # RUN:     --check-prefixes=VERSIONED-SYMS,VERSIONED-DEF-SYMS | 
 |  | 
 | #            VERSIONED-SYMS: [[TYPE]] globalversym | 
 | #       VERSIONED-SYMS-NEXT: [[TYPE]] localversym | 
 | # VERSIONED-UNDEF-SYMS-NEXT: [[TYPE]] version2sym@v2 | 
 | #   VERSIONED-DEF-SYMS-NEXT: [[TYPE]] version2sym@@v2 | 
 | #       VERSIONED-SYMS-NEXT: [[TYPE]] version3sym@v3hidden | 
 | #       VERSIONED-SYMS-NEXT: [[TYPE]] version4sym@v4 | 
 | #       VERSIONED-SYMS-NEXT: [[TYPE]] version5sym@v5hidden | 
 |  | 
 | --- !ELF | 
 | FileHeader: | 
 |   Class: ELFCLASS64 | 
 |   Data:  ELFDATA2LSB | 
 |   Type:  ET_DYN | 
 | Sections: | 
 |   - Name:    .gnu.version | 
 |     Type:    SHT_GNU_versym | 
 |     Flags:   [ SHF_ALLOC ] | 
 | ## 0x8000 is a special VERSYM_HIDDEN bit. | 
 |     Entries: [ 0, 0, 1, [[VERSYMENTRY=2]], 0x8003, 4, 0x8005 ] | 
 |     ShSize:  [[VERSYMSIZE=<none>]] | 
 |   - Name:         .gnu.version_d | 
 |     Type:         SHT_GNU_verdef | 
 |     Flags:        [ SHF_ALLOC ] | 
 |     Link:         .dynstr | 
 |     AddressAlign: 0x4 | 
 |     Info:         0x2 | 
 |     ShOffset:     [[VERDEFOFFSET=<none>]] | 
 |     Entries: | 
 |       - VersionNdx: 2 | 
 |         Names: | 
 |           - v2 | 
 |       - VersionNdx: 3 | 
 |         Names: | 
 |           - v3hidden | 
 |   - Name:  .gnu.version_r | 
 |     Type:  SHT_GNU_verneed | 
 |     Flags: [ SHF_ALLOC ] | 
 |     Link:  .dynstr | 
 |     Info:  0x2 | 
 |     Dependencies: | 
 |       - Version: 1 | 
 |         File:    file1.so | 
 |         Entries: | 
 |           - Name:  v4 | 
 |             Hash:  0 | 
 |             Flags: 0 | 
 |             Other: 4 | 
 |       - Version: 1 | 
 |         File:    file2.0 | 
 |         Entries: | 
 |           - Name:  v5hidden | 
 |             Hash:  0 | 
 |             Flags: 0 | 
 |             Other: 5 | 
 |   - Name:    .dynsym | 
 |     Type:    SHT_DYNSYM | 
 |     EntSize: [[ENTSIZE=<none>]] | 
 | DynamicSymbols: | 
 |   - Name:  localversym | 
 |     Index: [[INDEX=<none>]] | 
 |   - Name:  globalversym | 
 |     Index: [[INDEX=<none>]] | 
 |   - Name:  version2sym | 
 |     Index: [[INDEX=<none>]] | 
 |   - Name:  version3sym | 
 |     Index: [[INDEX=<none>]] | 
 |   - Name:  version4sym | 
 |     Index: [[INDEX=<none>]] | 
 |   - Name:  version5sym | 
 |     Index: [[INDEX=<none>]] | 
 |  | 
 | ## In the following cases we check we report warnings when unable to read symbol version. | 
 | ## Check that we still print unversioned symbol names. | 
 |  | 
 | ## Case 1: check we report a warning when unable to read symbol versions | 
 | ## from a broken SHT_GNU_verdef section. In this case its sh_offset | 
 | ## field has a too large value that goes past the EOF. | 
 |  | 
 | # RUN: yaml2obj --docnum=4 -DVERDEFOFFSET=0xffffffff %s -o %t4-broken-verdef.o | 
 | # RUN: llvm-nm --dynamic %t4-broken-verdef.o 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefixes=VERSION-ERR,VERSION-ERR1 | 
 |  | 
 | # 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) | 
 | # 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) | 
 | # 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 | 
 |  | 
 | # VERSION-ERR-NEXT: U globalversym{{$}} | 
 | # VERSION-ERR-NEXT: U localversym{{$}} | 
 | # VERSION-ERR-NEXT: U version2sym{{$}} | 
 | # VERSION-ERR-NEXT: U version3sym{{$}} | 
 | # VERSION-ERR-NEXT: U version4sym{{$}} | 
 | # VERSION-ERR-NEXT: U version5sym{{$}} | 
 |  | 
 | ## Case 2: check we report a warning when we are unable to read a SHT_GNU_versym section entry. | 
 | ## In this case, the section has a size that is not a multiple of its sh_entsize. | 
 |  | 
 | # RUN: yaml2obj --docnum=4 -DVERSYMSIZE=0xff %s -o %t4-broken-versym.o | 
 | # RUN: llvm-nm --dynamic %t4-broken-versym.o 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefixes=VERSION-ERR,VERSION-ERR2 | 
 |  | 
 | ## Case 3: check we report a warning when we are unable to get a version for a SHT_GNU_versym section entry. | 
 | ## In this case the SHT_GNU_versym section refers to a version index 255 which is missing. | 
 |  | 
 | # RUN: yaml2obj --docnum=4 -DVERSYMENTRY=0xff %s -o %t4-broken-index.o | 
 | # RUN: llvm-nm --dynamic %t4-broken-index.o 2>&1 | \ | 
 | # RUN:   FileCheck %s --check-prefixes=VERSION-ERR,VERSION-ERR3 | 
 |  | 
 | ## Case 4: check we report a warning when we are unable to get symbol flags. | 
 | ## In this case the dynamic symbol table has a wrong sh_entsize and we can't read a symbol. | 
 |  | 
 | # RUN: yaml2obj --docnum=4 -DENTSIZE=0xff %s -o %t4-broken-dynsym.o | 
 | # RUN: not llvm-nm --dynamic %t4-broken-dynsym.o 2>&1 | \ | 
 | # RUN:   FileCheck %s -DFILE=%t4-broken-dynsym.o --check-prefix=VERSION-ERR4 | 
 |  | 
 | # 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 | 
 | # VERSION-ERR4: error: [[FILE]]: section [index 4] has invalid sh_entsize: expected 24, but got 255 |