314 lines
12 KiB
Plaintext
314 lines
12 KiB
Plaintext
|
## Show that llvm-readobj prints symbol shndxes correctly, for valid indexes,
|
||
|
## invalid indexes (i.e. section indexes that don't correspond to a real
|
||
|
## section), reserved values and processor/os-specific index values, for both GNU
|
||
|
## and LLVM styles.
|
||
|
|
||
|
# RUN: yaml2obj --docnum=1 %s -o %t1
|
||
|
# RUN: llvm-readobj --symbols %t1 | FileCheck %s --check-prefix=LLVM1
|
||
|
# RUN: llvm-readelf --symbols %t1 | FileCheck %s --check-prefix=GNU1
|
||
|
|
||
|
# LLVM1: Name: undef
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: Undefined (0x0)
|
||
|
# LLVM1: Name: normal
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: .text (0x1)
|
||
|
# LLVM1: Name: common
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: Common (0xFFF2)
|
||
|
# LLVM1: Name: absolute
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: Absolute (0xFFF1)
|
||
|
# LLVM1: Name: proc
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: Processor Specific (0xFF01)
|
||
|
# LLVM1: Name: os
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: Operating System Specific (0xFF21)
|
||
|
# LLVM1: Name: reserved
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1-SAME: Reserved (0xFFFE)
|
||
|
# LLVM1: Name: xindex
|
||
|
# LLVM1: Section:
|
||
|
# LLVM1: .text (0x1)
|
||
|
|
||
|
# GNU1: Symbol table '.symtab' contains 9 entries:
|
||
|
# GNU1-NEXT: Num: {{.*}} Ndx Name
|
||
|
# GNU1-NEXT: 0: {{.*}} UND
|
||
|
# GNU1-NEXT: 1: {{.*}} UND undef
|
||
|
# GNU1-NEXT: 2: {{.*}} 1 normal
|
||
|
# GNU1-NEXT: 3: {{.*}} COM common
|
||
|
# GNU1-NEXT: 4: {{.*}} ABS absolute
|
||
|
# GNU1-NEXT: 5: {{.*}} PRC[0xff01] proc
|
||
|
# GNU1-NEXT: 6: {{.*}} OS[0xff21] os
|
||
|
# GNU1-NEXT: 7: {{.*}} RSV[0xfffe] reserved
|
||
|
# GNU1-NEXT: 8: {{.*}} 1 xindex
|
||
|
|
||
|
--- !ELF
|
||
|
FileHeader:
|
||
|
Class: ELFCLASS32
|
||
|
Data: ELFDATA2LSB
|
||
|
Type: ET_REL
|
||
|
Sections:
|
||
|
- Name: .text
|
||
|
Type: SHT_PROGBITS
|
||
|
- Name: .symtab_shndx
|
||
|
Type: SHT_SYMTAB_SHNDX
|
||
|
Link: .symtab
|
||
|
Entries: [ 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
|
||
|
Symbols:
|
||
|
- Name: [[NAME=undef]]
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=normal]]
|
||
|
Section: .text
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=common]]
|
||
|
Index: SHN_COMMON
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=absolute]]
|
||
|
Index: SHN_ABS
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=proc]]
|
||
|
Index: 0xff01
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=os]]
|
||
|
Index: 0xff21
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=reserved]]
|
||
|
Index: 0xfffe
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
- Name: [[NAME=xindex]]
|
||
|
Index: SHN_XINDEX
|
||
|
Binding: STB_GLOBAL
|
||
|
Type: [[TYPE=STT_NOTYPE]]
|
||
|
|
||
|
## Check the behavior for section symbols.
|
||
|
# RUN: yaml2obj --docnum=1 -DTYPE=STT_SECTION %s -o %t1-sec
|
||
|
# RUN: llvm-readobj --symbols %t1-sec | FileCheck %s --check-prefix=LLVM1
|
||
|
# RUN: llvm-readelf --symbols %t1-sec | FileCheck %s --check-prefix=GNU1
|
||
|
|
||
|
## Check the behavior for unnamed section symbols.
|
||
|
# RUN: yaml2obj --docnum=1 -DTYPE=STT_SECTION -DNAME="''" %s -o %t1-sec-unnamed
|
||
|
# RUN: llvm-readobj --symbols %t1-sec-unnamed 2>&1 | \
|
||
|
# RUN: FileCheck %s -DFILE=%t1-sec-unnamed --check-prefix=LLVM1-SEC-SYMS
|
||
|
# RUN: llvm-readelf --symbols %t1-sec-unnamed 2>&1 | \
|
||
|
# RUN: FileCheck %s -DFILE=%t1-sec-unnamed --check-prefix=GNU1-SEC-SYMS
|
||
|
|
||
|
# LLVM1-SEC-SYMS: Symbols [
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Undefined (0x0)
|
||
|
# LLVM1-SEC-SYMS: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0x0 (SHN_UNDEF)
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: <?> (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Undefined (0x0)
|
||
|
# LLVM1-SEC-SYMS: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: .text (0)
|
||
|
# LLVM1-SEC-SYMS: Section: .text (0x1)
|
||
|
# LLVM1-SEC-SYMS: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff2 (SHN_COMMON)
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: <?> (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Common (0xFFF2)
|
||
|
# LLVM1-SEC-SYMS: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff1 (SHN_ABS)
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: <?> (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Absolute (0xFFF1)
|
||
|
# LLVM1-SEC-SYMS: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xff01 (SHN_LOPROC+0x1)
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: <?> (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Processor Specific (0xFF01)
|
||
|
# LLVM1-SEC-SYMS: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xff21 (SHN_LOOS+0x1)
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: <?> (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Operating System Specific (0xFF21)
|
||
|
# LLVM1-SEC-SYMS: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfffe (SHN_LORESERVE+0xfe)
|
||
|
# LLVM1-SEC-SYMS-NEXT: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: <?> (0)
|
||
|
# LLVM1-SEC-SYMS: Section: Reserved (0xFFFE)
|
||
|
# LLVM1-SEC-SYMS: Symbol {
|
||
|
# LLVM1-SEC-SYMS-NEXT: Name: .text (0)
|
||
|
# LLVM1-SEC-SYMS: Section: .text (0x1)
|
||
|
|
||
|
# GNU1-SEC-SYMS: Num: {{.*}} Ndx Name
|
||
|
# GNU1-SEC-SYMS-NEXT: 0: {{.*}} UND {{$}}
|
||
|
# GNU1-SEC-SYMS-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0x0 (SHN_UNDEF)
|
||
|
# GNU1-SEC-SYMS-NEXT: 1: {{.*}} UND <?>
|
||
|
# GNU1-SEC-SYMS-NEXT: 2: {{.*}} 1 .text
|
||
|
# GNU1-SEC-SYMS-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff2 (SHN_COMMON)
|
||
|
# GNU1-SEC-SYMS-NEXT: 3: {{.*}} COM <?>
|
||
|
# GNU1-SEC-SYMS-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfff1 (SHN_ABS)
|
||
|
# GNU1-SEC-SYMS-NEXT: 4: {{.*}} ABS <?>
|
||
|
# GNU1-SEC-SYMS-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xff01 (SHN_LOPROC+0x1)
|
||
|
# GNU1-SEC-SYMS-NEXT: 5: {{.*}} PRC[0xff01] <?>
|
||
|
# GNU1-SEC-SYMS-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xff21 (SHN_LOOS+0x1)
|
||
|
# GNU1-SEC-SYMS-NEXT: 6: {{.*}} OS[0xff21] <?>
|
||
|
# GNU1-SEC-SYMS-NEXT: warning: '[[FILE]]': unable to get section index for symbol with st_shndx = 0xfffe (SHN_LORESERVE+0xfe)
|
||
|
# GNU1-SEC-SYMS-NEXT: 7: {{.*}} RSV[0xfffe] <?>
|
||
|
# GNU1-SEC-SYMS-NEXT: 8: {{.*}} 1 .text
|
||
|
|
||
|
## In this case, the index does not correspond to a real section. Check that GNU
|
||
|
## style just prints the section index as normal and LLVM style prints a warning
|
||
|
## (but only once for each warning).
|
||
|
# RUN: yaml2obj --docnum=2 %s -o %t2
|
||
|
# RUN: llvm-readobj --symbols %t2 2> %t2.llvm.err | FileCheck %s --check-prefix=LLVM2
|
||
|
# RUN: FileCheck %s --input-file=%t2.llvm.err --check-prefix=BAD-SHNDX --implicit-check-not=warning
|
||
|
# RUN: llvm-readelf --symbols %t2 2> %t2.gnu.err | FileCheck %s --check-prefix=GNU2
|
||
|
# RUN: FileCheck %s --input-file=%t2.gnu.err --allow-empty --implicit-check-not={{.}}
|
||
|
|
||
|
# LLVM2: Name: bad
|
||
|
# LLVM2: Section:
|
||
|
# LLVM2-SAME: <?> (0x42)
|
||
|
# LLVM2: Name: bad2
|
||
|
# LLVM2: Section:
|
||
|
# LLVM2-SAME: <?> (0x42)
|
||
|
# LLVM2: Name: bad3
|
||
|
# LLVM2: Section:
|
||
|
# LLVM2-SAME: <?> (0x43)
|
||
|
# LLVM2: Name: invalid_shndx
|
||
|
# LLVM2: Section:
|
||
|
# LLVM2-SAME: <?> (0x9)
|
||
|
# LLVM2: Name: invalid_shndx2
|
||
|
# LLVM2: Section:
|
||
|
# LLVM2-SAME: <?> (0x9)
|
||
|
# LLVM2: Name: invalid_shndx3
|
||
|
# LLVM2: Section:
|
||
|
# LLVM2-SAME: <?> (0xA)
|
||
|
|
||
|
# GNU2: Symbol table '.symtab' contains 7 entries:
|
||
|
# GNU2-NEXT: Num: {{.*}} Ndx Name
|
||
|
# GNU2-NEXT: 0: {{.*}} UND
|
||
|
# GNU2-NEXT: 1: {{.*}} 66 bad
|
||
|
# GNU2-NEXT: 2: {{.*}} 66 bad2
|
||
|
# GNU2-NEXT: 3: {{.*}} 67 bad3
|
||
|
# GNU2-NEXT: 4: {{.*}} 9 invalid_shndx
|
||
|
# GNU2-NEXT: 5: {{.*}} 9 invalid_shndx2
|
||
|
# GNU2-NEXT: 6: {{.*}} 10 invalid_shndx3
|
||
|
|
||
|
# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 66
|
||
|
# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 67
|
||
|
# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 9
|
||
|
# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 10
|
||
|
|
||
|
--- !ELF
|
||
|
FileHeader:
|
||
|
Class: ELFCLASS32
|
||
|
Data: ELFDATA2LSB
|
||
|
Type: ET_REL
|
||
|
Sections:
|
||
|
- Name: .symtab_shndx
|
||
|
Type: SHT_SYMTAB_SHNDX
|
||
|
Link: .symtab
|
||
|
Entries: [ 0, 0, 0, 0, 9, 9, 10 ]
|
||
|
Symbols:
|
||
|
- Name: bad
|
||
|
Index: 0x42
|
||
|
- Name: bad2
|
||
|
Index: 0x42
|
||
|
- Name: bad3
|
||
|
Index: 0x43
|
||
|
- Name: invalid_shndx
|
||
|
Index: SHN_XINDEX
|
||
|
- Name: invalid_shndx2
|
||
|
Index: SHN_XINDEX
|
||
|
- Name: invalid_shndx3
|
||
|
Index: SHN_XINDEX
|
||
|
|
||
|
## In this case, the symtab shndx section is missing, so symbols with section
|
||
|
## indexes of SHN_XINDEX print as Reserved symbols.
|
||
|
# RUN: yaml2obj --docnum=3 %s -o %t3
|
||
|
# RUN: llvm-readobj --symbols %t3 2> %t3.llvm.err | FileCheck %s --check-prefix=LLVM3
|
||
|
# RUN: FileCheck %s --input-file=%t3.llvm.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning
|
||
|
# RUN: llvm-readelf --symbols %t3 2> %t3.gnu.err | FileCheck %s --check-prefix=GNU3
|
||
|
# RUN: FileCheck %s --input-file=%t3.gnu.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning
|
||
|
|
||
|
# LLVM3: Name: no_shndx
|
||
|
# LLVM3: Section:
|
||
|
# LLVM3-SAME: Reserved (0xFFFF)
|
||
|
# LLVM3: Name: no_shndx2
|
||
|
# LLVM3: Section:
|
||
|
# LLVM3-SAME: Reserved (0xFFFF)
|
||
|
|
||
|
# GNU3: Symbol table '.symtab' contains 3 entries:
|
||
|
# GNU3-NEXT: Num: {{.*}} Ndx Name
|
||
|
# GNU3-NEXT: 0: {{.*}} UND
|
||
|
# GNU3-NEXT: 1: {{.*}} RSV[0xffff] no_shndx
|
||
|
# GNU3-NEXT: 2: {{.*}} RSV[0xffff] no_shndx2
|
||
|
|
||
|
# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': found an extended symbol index (1), but unable to locate the extended symbol index table
|
||
|
# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': found an extended symbol index (2), but unable to locate the extended symbol index table
|
||
|
|
||
|
--- !ELF
|
||
|
FileHeader:
|
||
|
Class: ELFCLASS32
|
||
|
Data: ELFDATA2LSB
|
||
|
Type: ET_REL
|
||
|
Symbols:
|
||
|
- Name: no_shndx
|
||
|
Index: SHN_XINDEX
|
||
|
- Name: no_shndx2
|
||
|
Index: SHN_XINDEX
|
||
|
|
||
|
## Check we can dump symbols even when the number of entries in the
|
||
|
## SHT_SYMTAB_SHNDX section doesn't match the number of symbols in the symbol table.
|
||
|
|
||
|
# RUN: yaml2obj --docnum=4 %s -o %t4
|
||
|
# RUN: llvm-readelf --symbols %t4 2>&1 | FileCheck %s -DFILE=%t4 --check-prefix=SHNDX-ERR-GNU
|
||
|
# RUN: llvm-readobj --symbols %t4 2>&1 | FileCheck %s -DFILE=%t4 --check-prefix=SHNDX-ERR-LLVM
|
||
|
|
||
|
# SHNDX-ERR-GNU: warning: '[[FILE]]': SHT_SYMTAB_SHNDX has 3 entries, but the symbol table associated has 2
|
||
|
# SHNDX-ERR-GNU-EMPTY:
|
||
|
# SHNDX-ERR-GNU-NEXT: Symbol table '.symtab' contains 2 entries:
|
||
|
# SHNDX-ERR-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
|
||
|
# SHNDX-ERR-GNU-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
|
||
|
# SHNDX-ERR-GNU-NEXT: warning: '[[FILE]]': found an extended symbol index (1), but unable to locate the extended symbol index table
|
||
|
# SHNDX-ERR-GNU-NEXT: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT RSV[0xffff]
|
||
|
# SHNDX-ERR-GNU-EMPTY:
|
||
|
# SHNDX-ERR-GNU-NOT:{{.}}
|
||
|
|
||
|
# SHNDX-ERR-LLVM: warning: '[[FILE]]': SHT_SYMTAB_SHNDX has 3 entries, but the symbol table associated has 2
|
||
|
# SHNDX-ERR-LLVM: Format: elf64-unknown
|
||
|
# SHNDX-ERR-LLVM-NEXT: Arch: unknown
|
||
|
# SHNDX-ERR-LLVM-NEXT: AddressSize: 64bit
|
||
|
# SHNDX-ERR-LLVM-NEXT: LoadName: <Not found>
|
||
|
# SHNDX-ERR-LLVM-NEXT: Symbols [
|
||
|
# SHNDX-ERR-LLVM-NEXT: Symbol {
|
||
|
# SHNDX-ERR-LLVM-NEXT: Name: (0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: Value: 0x0
|
||
|
# SHNDX-ERR-LLVM-NEXT: Size: 0
|
||
|
# SHNDX-ERR-LLVM-NEXT: Binding: Local (0x0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: Type: None (0x0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: Other: 0
|
||
|
# SHNDX-ERR-LLVM-NEXT: Section: Undefined (0x0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: }
|
||
|
# SHNDX-ERR-LLVM-NEXT: Symbol {
|
||
|
# SHNDX-ERR-LLVM-NEXT: Name: (0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: Value: 0x0
|
||
|
# SHNDX-ERR-LLVM-NEXT: Size: 0
|
||
|
# SHNDX-ERR-LLVM-NEXT: Binding: Local (0x0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: Type: None (0x0)
|
||
|
# SHNDX-ERR-LLVM-NEXT: Other: 0
|
||
|
# SHNDX-ERR-LLVM-NEXT: warning: '[[FILE]]': found an extended symbol index (1), but unable to locate the extended symbol index table
|
||
|
# SHNDX-ERR-LLVM-NEXT: Section: Reserved (0xFFFF)
|
||
|
# SHNDX-ERR-LLVM-NEXT: }
|
||
|
# SHNDX-ERR-LLVM-NEXT: ]
|
||
|
|
||
|
--- !ELF
|
||
|
FileHeader:
|
||
|
Class: ELFCLASS64
|
||
|
Data: ELFDATA2LSB
|
||
|
Type: ET_REL
|
||
|
Sections:
|
||
|
- Name: .symtab_shndx
|
||
|
Type: SHT_SYMTAB_SHNDX
|
||
|
Entries: [ 0, 1, 2 ]
|
||
|
Link: .symtab
|
||
|
Symbols:
|
||
|
- Index: SHN_XINDEX
|