250 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
## Test how llvm-readobj/llvm-readelf tools handle invalid SHT_GNU_versym sections.
 | 
						|
 | 
						|
## Check that we report a warning when sh_link references a non-existent section.
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=1 %s -o %t1
 | 
						|
# RUN: llvm-readelf -V %t1 2>&1 | FileCheck -DFILE=%t1 %s --check-prefix=GNU-INVALID-LINK
 | 
						|
# RUN: llvm-readobj -V %t1 2>&1 | FileCheck -DFILE=%t1 %s --check-prefix=LLVM-INVALID-LINK
 | 
						|
 | 
						|
# GNU-INVALID-LINK:      Version symbols section '.gnu.version' contains 0 entries:
 | 
						|
# GNU-INVALID-LINK-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: invalid section index: 255
 | 
						|
# GNU-INVALID-LINK-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 255 (<corrupt>)
 | 
						|
 | 
						|
# LLVM-INVALID-LINK:      VersionSymbols [
 | 
						|
# LLVM-INVALID-LINK-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: invalid section index: 255
 | 
						|
# LLVM-INVALID-LINK-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Link:    0xFF
 | 
						|
    Entries: [ ]
 | 
						|
 | 
						|
## Check that we report a warning when the sh_link field of a SHT_GNU_versym section does not reference
 | 
						|
## a dynamic symbol table section.
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=2 %s -o %t2
 | 
						|
# RUN: llvm-readelf -V %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefix=INVALID-SYMBOL-TABLE-GNU
 | 
						|
# RUN: llvm-readobj -V %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefix=INVALID-SYMBOL-TABLE-LLVM
 | 
						|
 | 
						|
# INVALID-SYMBOL-TABLE-GNU:      Version symbols section '.gnu.version' contains 1 entries:
 | 
						|
# INVALID-SYMBOL-TABLE-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 0 ()
 | 
						|
# INVALID-SYMBOL-TABLE-GNU-NEXT:  warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: expected SHT_DYNSYM, but got SHT_NULL
 | 
						|
# INVALID-SYMBOL-TABLE-GNU-NEXT:  000:   0 (*local*)
 | 
						|
 | 
						|
# INVALID-SYMBOL-TABLE-LLVM:      VersionSymbols [
 | 
						|
# INVALID-SYMBOL-TABLE-LLVM-NEXT: warning: '[[FILE]]': invalid section linked to SHT_GNU_versym section with index 1: expected SHT_DYNSYM, but got SHT_NULL
 | 
						|
# INVALID-SYMBOL-TABLE-LLVM-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Link:    0x0
 | 
						|
    Entries: [ 0 ]
 | 
						|
 | 
						|
## Check we report a warning when something is wrong with a string table linked to a symbol table that
 | 
						|
## is linked with SHT_GNU_versym. In this case we are unable to produce LLVM style output,
 | 
						|
## but GNU style is fine because it does not need that string table.
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=3 %s -o %t3
 | 
						|
# RUN: llvm-readelf -V %t3 2>&1 | FileCheck -DFILE=%t3 %s --check-prefix=INVALID-STRING-TABLE-GNU
 | 
						|
# RUN: llvm-readobj -V %t3 2>&1 | FileCheck -DFILE=%t3 %s --check-prefix=INVALID-STRING-TABLE-LLVM
 | 
						|
 | 
						|
# INVALID-STRING-TABLE-GNU:      Version symbols section '.gnu.version' contains 1 entries:
 | 
						|
# INVALID-STRING-TABLE-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 3 (.dynsym)
 | 
						|
# INVALID-STRING-TABLE-GNU-NEXT:  warning: '[[FILE]]': can't get a string table for the symbol table linked to SHT_GNU_versym section with index 1: invalid string table linked to SHT_DYNSYM section with index 3: invalid sh_type for string table section [index 2]: expected SHT_STRTAB, but got SHT_NULL
 | 
						|
# INVALID-STRING-TABLE-GNU-NEXT:  000:   0 (*local*)
 | 
						|
 | 
						|
# INVALID-STRING-TABLE-LLVM:      VersionSymbols [
 | 
						|
# INVALID-STRING-TABLE-LLVM-NEXT: warning: '[[FILE]]': can't get a string table for the symbol table linked to SHT_GNU_versym section with index 1: invalid string table linked to SHT_DYNSYM section with index 3: invalid sh_type for string table section [index 2]: expected SHT_STRTAB, but got SHT_NULL
 | 
						|
# INVALID-STRING-TABLE-LLVM-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Link:    .dynsym
 | 
						|
    Entries: [ 0 ]
 | 
						|
  - Name:    .dynstr
 | 
						|
    Type:    SHT_NULL
 | 
						|
DynamicSymbols: []
 | 
						|
 | 
						|
## Check we report a warning when a SHT_GNU_versym section is not correctly aligned in memory.
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=4 %s -o %t4
 | 
						|
# RUN: llvm-readelf -V %t4 2>&1 | FileCheck -DFILE=%t4 %s --check-prefix=MISALIGNED-GNU
 | 
						|
# RUN: llvm-readobj -V %t4 2>&1 | FileCheck -DFILE=%t4 %s --check-prefix=MISALIGNED-LLVM
 | 
						|
 | 
						|
# MISALIGNED-GNU:      Version symbols section '.gnu.version' contains 0 entries:
 | 
						|
# MISALIGNED-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x00ffff  Link: 0 ()
 | 
						|
# MISALIGNED-GNU-NEXT:  warning: '[[FILE]]': the SHT_GNU_versym section with index 1 is misaligned
 | 
						|
 | 
						|
# MISALIGNED-LLVM:      VersionSymbols [
 | 
						|
# MISALIGNED-LLVM-NEXT:  warning: '[[FILE]]': the SHT_GNU_versym section with index 1 is misaligned
 | 
						|
# MISALIGNED-LLVM-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Entries: [ ]
 | 
						|
    ShOffset: 0xffff
 | 
						|
 | 
						|
## Check we report a warning when a SHT_GNU_versym section has an invalid entry size.
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=5 %s -o %t5
 | 
						|
# RUN: llvm-readelf -V %t5 2>&1 | FileCheck -DFILE=%t5 %s --check-prefix=INVALID-ENT-SIZE-GNU
 | 
						|
# RUN: llvm-readobj -V %t5 2>&1 | FileCheck -DFILE=%t5 %s --check-prefix=INVALID-ENT-SIZE-LLVM
 | 
						|
 | 
						|
# INVALID-ENT-SIZE-GNU:      Version symbols section '.gnu.version' contains 1 entries:
 | 
						|
# INVALID-ENT-SIZE-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 0 ()
 | 
						|
# INVALID-ENT-SIZE-GNU-NEXT: warning: '[[FILE]]': cannot read content of SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_entsize: 3
 | 
						|
 | 
						|
# INVALID-ENT-SIZE-LLVM:      VersionSymbols [
 | 
						|
# INVALID-ENT-SIZE-LLVM-NEXT: warning: '[[FILE]]': cannot read content of SHT_GNU_versym section with index 1: section [index 1] has an invalid sh_entsize: 3
 | 
						|
# INVALID-ENT-SIZE-LLVM-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Entries: [ 0 ]
 | 
						|
    EntSize: 3
 | 
						|
 | 
						|
## Check we report a warning when the number of version entries does not match the number of symbols in the associated symbol table.
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=6 %s -o %t6
 | 
						|
# RUN: llvm-readelf -V %t6 2>&1 | FileCheck -DFILE=%t6 %s --check-prefix=SYMBOLS-NUM-MISMATCH-GNU
 | 
						|
# RUN: llvm-readobj -V %t6 2>&1 | FileCheck -DFILE=%t6 %s --check-prefix=SYMBOLS-NUM-MISMATCH-LLVM
 | 
						|
 | 
						|
# SYMBOLS-NUM-MISMATCH-GNU:      Version symbols section '.gnu.version' contains 2 entries:
 | 
						|
# SYMBOLS-NUM-MISMATCH-GNU-NEXT:  Addr: 0000000000000000  Offset: 0x000040  Link: 2 (.dynsym)
 | 
						|
# SYMBOLS-NUM-MISMATCH-GNU-NEXT:  warning: '[[FILE]]': SHT_GNU_versym section with index 1: the number of entries (2) does not match the number of symbols (3) in the symbol table with index 2
 | 
						|
# SYMBOLS-NUM-MISMATCH-GNU-NEXT:   000:   0 (*local*)       1 (*global*)
 | 
						|
 | 
						|
# SYMBOLS-NUM-MISMATCH-LLVM:      VersionSymbols [
 | 
						|
# SYMBOLS-NUM-MISMATCH-LLVM-NEXT: warning: '[[FILE]]': SHT_GNU_versym section with index 1: the number of entries (2) does not match the number of symbols (3) in the symbol table with index 2
 | 
						|
# SYMBOLS-NUM-MISMATCH-LLVM-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Entries: [ 0, 1 ]
 | 
						|
    Link:   .dynsym
 | 
						|
DynamicSymbols:
 | 
						|
  - Name: foo
 | 
						|
  - Name: bar
 | 
						|
 | 
						|
## Check we can dump a SHT_GNU_versym section when it is linked to a custom dynamic symbol
 | 
						|
## table that is not called ".dynsym".
 | 
						|
 | 
						|
# RUN: yaml2obj --docnum=7 %s -o %t7
 | 
						|
# RUN: llvm-readelf -V %t7 2>&1 | FileCheck -DFILE=%t7 %s --check-prefix=CUSTOM-SYMTAB-GNU
 | 
						|
# RUN: llvm-readobj -V %t7 2>&1 | FileCheck -DFILE=%t7 %s --check-prefix=CUSTOM-SYMTAB-LLVM
 | 
						|
 | 
						|
# CUSTOM-SYMTAB-GNU:      Version symbols section '.gnu.version' contains 1 entries:
 | 
						|
# CUSTOM-SYMTAB-GNU-NEXT:   Addr: 0000000000000000  Offset: 0x000040  Link: 2 (.foo.dynsym)
 | 
						|
# CUSTOM-SYMTAB-GNU-NEXT:    000:   0 (*local*)
 | 
						|
 | 
						|
# CUSTOM-SYMTAB-LLVM:      VersionSymbols [
 | 
						|
# CUSTOM-SYMTAB-LLVM-NEXT:  Symbol {
 | 
						|
# CUSTOM-SYMTAB-LLVM-NEXT:    Version: 0
 | 
						|
# CUSTOM-SYMTAB-LLVM-NEXT:    Name:
 | 
						|
# CUSTOM-SYMTAB-LLVM-NEXT:  }
 | 
						|
# CUSTOM-SYMTAB-LLVM-NEXT: ]
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_EXEC
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Link:    .foo.dynsym
 | 
						|
    Entries: [ 0 ]
 | 
						|
## A custom empty dynamic symbol table with a null entry.
 | 
						|
  - Name:    .foo.dynsym
 | 
						|
    Type:    SHT_DYNSYM
 | 
						|
    Link:    .dynstr
 | 
						|
    EntSize: 24
 | 
						|
    Size:    24
 | 
						|
DynamicSymbols:
 | 
						|
  - Name: foo
 | 
						|
  - Name: bar
 | 
						|
 | 
						|
## Version index in a SHT_GNU_versym section overflows the version map.
 | 
						|
## Check we report it when trying to dump dynamic symbols.
 | 
						|
 | 
						|
# RUN: yaml2obj %s --docnum=8 -o %t8
 | 
						|
# RUN: llvm-readobj --dyn-syms %t8 2>&1 \
 | 
						|
# RUN:   | FileCheck -DFILE=%t8 --implicit-check-not=warning --check-prefix=VERSION-OVERFLOW-LLVM %s
 | 
						|
# RUN: llvm-readelf --dyn-syms %t8 2>&1 \
 | 
						|
# RUN:   | FileCheck -DFILE=%t8 --implicit-check-not=warning --check-prefix=VERSION-OVERFLOW-GNU %s
 | 
						|
 | 
						|
# VERSION-OVERFLOW-LLVM:      DynamicSymbols [
 | 
						|
# VERSION-OVERFLOW-LLVM-NEXT: warning: '[[FILE]]': SHT_GNU_versym section refers to a version index 255 which is missing
 | 
						|
# VERSION-OVERFLOW-LLVM-NEXT:   Symbol {
 | 
						|
# VERSION-OVERFLOW-LLVM-NEXT:     Name: @<corrupt> (0)
 | 
						|
# VERSION-OVERFLOW-LLVM:      warning: '[[FILE]]': SHT_GNU_versym section refers to a version index 254 which is missing
 | 
						|
# VERSION-OVERFLOW-LLVM-NEXT:   Symbol {
 | 
						|
# VERSION-OVERFLOW-LLVM-NEXT:     Name: foo@<corrupt> (5)
 | 
						|
# VERSION-OVERFLOW-LLVM:        Symbol {
 | 
						|
# VERSION-OVERFLOW-LLVM-NEXT:     Name: bar@<corrupt> (1)
 | 
						|
 | 
						|
# VERSION-OVERFLOW-GNU:      Symbol table '.dynsym' contains 3 entries:
 | 
						|
# VERSION-OVERFLOW-GNU-NEXT:  Num:    Value          Size Type    Bind   Vis       Ndx Name
 | 
						|
# VERSION-OVERFLOW-GNU-NEXT: warning: '[[FILE]]': SHT_GNU_versym section refers to a version index 255 which is missing
 | 
						|
# VERSION-OVERFLOW-GNU-NEXT:     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND @<corrupt>
 | 
						|
# VERSION-OVERFLOW-GNU-NEXT: warning: '[[FILE]]': SHT_GNU_versym section refers to a version index 254 which is missing
 | 
						|
# VERSION-OVERFLOW-GNU-NEXT:     1: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND foo@<corrupt>
 | 
						|
# VERSION-OVERFLOW-GNU-NEXT:     2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND bar@<corrupt
 | 
						|
 | 
						|
--- !ELF
 | 
						|
FileHeader:
 | 
						|
  Class:   ELFCLASS64
 | 
						|
  Data:    ELFDATA2LSB
 | 
						|
  Type:    ET_DYN
 | 
						|
  Machine: EM_X86_64
 | 
						|
Sections:
 | 
						|
  - Name:    .gnu.version
 | 
						|
    Type:    SHT_GNU_versym
 | 
						|
    Entries: [ 0xFF, 0xFE, 0xFF ]
 | 
						|
DynamicSymbols:
 | 
						|
  - Name: foo
 | 
						|
  - Name: bar
 |