| ## 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 |