194 lines
6.8 KiB
Plaintext
194 lines
6.8 KiB
Plaintext
|
## 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
|