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
 |