symbol-shndx.test 5.66 KB
## 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 > %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
  Machine: EM_386
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:    undef
    Binding: STB_GLOBAL
  - Name:    normal
    Section: .text
    Binding: STB_GLOBAL
  - Name:    common
    Index:   SHN_COMMON
    Binding: STB_GLOBAL
  - Name:    absolute
    Index:   SHN_ABS
    Binding: STB_GLOBAL
  - Name:    proc
    Index:   0xff01
    Binding: STB_GLOBAL
  - Name:    os
    Index:   0xff21
    Binding: STB_GLOBAL
  - Name:    reserved
    Index:   0xfffe
    Binding: STB_GLOBAL
  - Name:    xindex
    Index:   SHN_XINDEX
    Binding: STB_GLOBAL

## 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 > %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
  Machine: EM_386
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 > %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': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0
# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (2) is past the end of the SHT_SYMTAB_SHNDX section of size 0

--- !ELF
FileHeader:
  Class:   ELFCLASS32
  Data:    ELFDATA2LSB
  Type:    ET_REL
  Machine: EM_386
Symbols:
  - Name:  no_shndx
    Index: SHN_XINDEX
  - Name:  no_shndx2
    Index: SHN_XINDEX