332 lines
13 KiB
Plaintext
332 lines
13 KiB
Plaintext
## In this file we have tests for the SHT_SYMTAB_SHNDX section
|
|
## and the DT_SYMTAB_SHNDX dynamic tag.
|
|
|
|
## Check that different SHT_SYMTAB_SHNDX sections can be used with different symbol tables.
|
|
## In this test we check that we print different section indexes for regular and dynamic
|
|
## symbol tables that are linked to different SHT_SYMTAB_SHNDX sections.
|
|
|
|
# RUN: yaml2obj --docnum=1 %s -o %t1
|
|
# RUN: llvm-readelf --symbols --dyn-syms %t1 2>&1 | FileCheck %s --check-prefix=GNU
|
|
# RUN: llvm-readobj --symbols --dyn-syms %t1 2>&1 | FileCheck %s --check-prefix=LLVM
|
|
|
|
# GNU: Symbol table '.dynsym' contains 3 entries:
|
|
# GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
|
|
# GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
|
|
# GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT 3 dynsym1
|
|
# GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT 2 dynsym2
|
|
# GNU: Symbol table '.symtab' contains 3 entries:
|
|
# GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
|
|
# GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
|
|
# GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT 2 sym1
|
|
# GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT 1 sym2
|
|
|
|
# LLVM: Symbols [
|
|
# LLVM-NEXT: Symbol {
|
|
# LLVM-NEXT: Name: (0)
|
|
# LLVM: Section: Undefined (0x0)
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: Symbol {
|
|
# LLVM-NEXT: Name: sym1 (6)
|
|
# LLVM: Section: .section2 (0x2)
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: Symbol {
|
|
# LLVM-NEXT: Name: sym2 (1)
|
|
# LLVM: Section: .section1 (0x1)
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: ]
|
|
# LLVM: DynamicSymbols [
|
|
# LLVM-NEXT: Symbol {
|
|
# LLVM-NEXT: Name: (0)
|
|
# LLVM: Section: Undefined (0x0)
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: Symbol {
|
|
# LLVM-NEXT: Name: dynsym1 (9)
|
|
# LLVM: Section: .section3 (0x3)
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: Symbol {
|
|
# LLVM-NEXT: Name: dynsym2 (1)
|
|
# LLVM: Section: .section2 (0x2)
|
|
# LLVM-NEXT: }
|
|
# LLVM-NEXT: ]
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Name: .section1
|
|
Type: SHT_PROGBITS
|
|
- Name: .section2
|
|
Type: SHT_PROGBITS
|
|
- Name: .section3
|
|
Type: SHT_PROGBITS
|
|
- Name: .dynamic
|
|
Type: SHT_DYNAMIC
|
|
Flags: [ SHF_ALLOC ]
|
|
Address: 0x1000
|
|
Offset: 0x1000
|
|
Entries:
|
|
- Tag: [[TAGNAME=DT_SYMTAB_SHNDX]]
|
|
Value: [[SYMTABSHNDX=0x2100]] ## Address of .bar section.
|
|
- Tag: DT_NULL
|
|
Value: 0
|
|
## By naming the SHT_SYMTAB_SHNDX sections to .foo and .bar we verify that we
|
|
## don't use their names to locate them.
|
|
- Name: .foo
|
|
Type: SHT_SYMTAB_SHNDX
|
|
Flags: [ SHF_ALLOC ]
|
|
Link: [[SHNDXLINK=.symtab]]
|
|
Entries: [ 0, 2, 1 ]
|
|
Offset: 0x2000
|
|
Address: 0x2000
|
|
- Name: .bar
|
|
Type: SHT_SYMTAB_SHNDX
|
|
Flags: [ SHF_ALLOC ]
|
|
Link: .dynsym
|
|
Entries: [ 0, 3, 2 ]
|
|
Offset: 0x2100
|
|
Address: 0x2100
|
|
Symbols:
|
|
- Name: sym1
|
|
Index: SHN_XINDEX
|
|
- Name: sym2
|
|
Index: SHN_XINDEX
|
|
DynamicSymbols:
|
|
- Name: dynsym1
|
|
Index: SHN_XINDEX
|
|
- Name: dynsym2
|
|
Index: SHN_XINDEX
|
|
ProgramHeaders:
|
|
- Type: PT_LOAD
|
|
VAddr: 0x1000
|
|
FirstSec: .dynamic
|
|
LastSec: .bar
|
|
- Type: PT_DYNAMIC
|
|
VAddr: 0x1000
|
|
FirstSec: .dynamic
|
|
LastSec: .dynamic
|
|
|
|
## Check that we locate the SHT_SYMTAB_SHNDX section using the DT_SYMTAB_SHNDX
|
|
## dynamic tag when dumping dynamic symbols. In this case we make the value of
|
|
## DT_SYMTAB_SHNDX point to the SHT_SYMTAB_SHNDX section that is
|
|
## linked with the static symbol table and check that we use it.
|
|
|
|
# RUN: yaml2obj --docnum=1 -DSYMTABSHNDX=0x2000 %s -o %t2
|
|
# RUN: llvm-readelf --dyn-syms %t2 2>&1 | FileCheck %s --check-prefix=DYNTAG-GNU
|
|
# RUN: llvm-readobj --dyn-syms %t2 2>&1 | FileCheck %s --check-prefix=DYNTAG-LLVM
|
|
|
|
# DYNTAG-GNU: Symbol table '.dynsym' contains 3 entries:
|
|
# DYNTAG-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
|
|
# DYNTAG-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
|
|
# DYNTAG-GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT 2 dynsym1
|
|
# DYNTAG-GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT 1 dynsym2
|
|
|
|
# DYNTAG-LLVM: Name: dynsym1 (9)
|
|
# DYNTAG-LLVM: Section: .section2 (0x2)
|
|
# DYNTAG-LLVM-NEXT: }
|
|
# DYNTAG-LLVM-NEXT: Symbol {
|
|
# DYNTAG-LLVM-NEXT: Name: dynsym2 (1)
|
|
# DYNTAG-LLVM: Section: .section1 (0x1)
|
|
# DYNTAG-LLVM-NEXT: }
|
|
# DYNTAG-LLVM-NEXT: ]
|
|
|
|
## Check that we report a warning when we dump a dynamic symbol table that
|
|
## contains symbols with extended indices, but we don't have a DT_SYMTAB_SHNDX tag to locate
|
|
## the corresponding extended indexes table.
|
|
|
|
# RUN: yaml2obj --docnum=1 -DTAGNAME=0x0 -DSYMTABSHNDX=0x0 %s -o %t3
|
|
# RUN: llvm-readelf --symbols --dyn-syms %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=NOTAG-GNU
|
|
# RUN: llvm-readobj --symbols --dyn-syms %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=NOTAG-LLVM
|
|
|
|
# NOTAG-GNU: Symbol table '.dynsym' contains 3 entries:
|
|
# NOTAG-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
|
|
# NOTAG-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
|
|
# NOTAG-GNU-NEXT: warning: '[[FILE]]': found an extended symbol index (1), but unable to locate the extended symbol index table
|
|
# NOTAG-GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT RSV[0xffff] dynsym1
|
|
# NOTAG-GNU-NEXT: warning: '[[FILE]]': found an extended symbol index (2), but unable to locate the extended symbol index table
|
|
# NOTAG-GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT RSV[0xffff] dynsym2
|
|
|
|
# NOTAG-LLVM: Symbol {
|
|
# NOTAG-LLVM: Name: dynsym1 (9)
|
|
# NOTAG-LLVM-NEXT: Value: 0x0
|
|
# NOTAG-LLVM-NEXT: Size: 0
|
|
# NOTAG-LLVM-NEXT: Binding: Local (0x0)
|
|
# NOTAG-LLVM-NEXT: Type: None (0x0)
|
|
# NOTAG-LLVM-NEXT: Other: 0
|
|
# NOTAG-LLVM-NEXT: warning: '[[FILE]]': found an extended symbol index (1), but unable to locate the extended symbol index table
|
|
# NOTAG-LLVM-NEXT: Section: Reserved (0xFFFF)
|
|
# NOTAG-LLVM-NEXT: }
|
|
# NOTAG-LLVM-NEXT: Symbol {
|
|
# NOTAG-LLVM-NEXT: Name: dynsym2 (1)
|
|
# NOTAG-LLVM-NEXT: Value: 0x0
|
|
# NOTAG-LLVM-NEXT: Size: 0
|
|
# NOTAG-LLVM-NEXT: Binding: Local (0x0)
|
|
# NOTAG-LLVM-NEXT: Type: None (0x0)
|
|
# NOTAG-LLVM-NEXT: Other: 0
|
|
# NOTAG-LLVM-NEXT: warning: '[[FILE]]': found an extended symbol index (2), but unable to locate the extended symbol index table
|
|
# NOTAG-LLVM-NEXT: Section: Reserved (0xFFFF)
|
|
# NOTAG-LLVM-NEXT: }
|
|
|
|
## In this case we have a SHT_SYMTAB_SHNDX section with a sh_link field that has a
|
|
## value that is larger than the number of sections. Check we report a warning.
|
|
|
|
# RUN: yaml2obj --docnum=1 -DSHNDXLINK=0xFF %s -o %t4
|
|
# RUN: llvm-readelf --symbols --dyn-syms %t4 2>&1 | \
|
|
# RUN: FileCheck %s -DFILE=%t4 --check-prefixes=BROKENLINK,BROKENLINK-GNU --implicit-check-not=warning:
|
|
# RUN: llvm-readobj --symbols --dyn-syms %t4 2>&1 | \
|
|
# RUN: FileCheck %s -DFILE=%t4 --check-prefixes=BROKENLINK,BROKENLINK-LLVM --implicit-check-not=warning:
|
|
|
|
# BROKENLINK: warning: '[[FILE]]': unable to get the associated symbol table for SHT_SYMTAB_SHNDX section with index 5: sh_link (255) is greater than or equal to the total number of sections (12)
|
|
|
|
# BROKENLINK-GNU: warning: '[[FILE]]': found an extended symbol index (1), but unable to locate the extended symbol index table
|
|
# BROKENLINK-GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT RSV[0xffff] sym1
|
|
# BROKENLINK-GNU-NEXT: warning: '[[FILE]]': found an extended symbol index (2), but unable to locate the extended symbol index table
|
|
# BROKENLINK-GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT RSV[0xffff] sym2
|
|
|
|
# BROKENLINK-LLVM: Symbol {
|
|
# BROKENLINK-LLVM: Name: sym1 (6)
|
|
# BROKENLINK-LLVM: warning: '[[FILE]]': found an extended symbol index (1), but unable to locate the extended symbol index table
|
|
# BROKENLINK-LLVM-NEXT: Section: Reserved (0xFFFF)
|
|
# BROKENLINK-LLVM-NEXT: }
|
|
# BROKENLINK-LLVM-NEXT: Symbol {
|
|
# BROKENLINK-LLVM-NEXT: Name: sym2 (1)
|
|
# BROKENLINK-LLVM: warning: '[[FILE]]': found an extended symbol index (2), but unable to locate the extended symbol index table
|
|
# BROKENLINK-LLVM-NEXT: Section: Reserved (0xFFFF)
|
|
# BROKENLINK-LLVM-NEXT: }
|
|
|
|
## Check we report a warning when multiple SHT_SYMTAB_SHNDX sections are linked to a symbol table.
|
|
## In this case, 2 sections are linked to the dynamic symbol table. Check it doesn't affect
|
|
## anything, because the SHT_SYMTAB_SHNDX section specified by the DT_SYMTAB_SHNDX tag is still used.
|
|
|
|
# RUN: yaml2obj --docnum=1 -DSHNDXLINK=.dynsym %s -o %t.multiple
|
|
# RUN: llvm-readelf --symbols --dyn-syms %t.multiple 2>&1 | \
|
|
# RUN: FileCheck %s -DFILE=%t.multiple --check-prefix=MULTIPLE-GNU
|
|
# RUN: llvm-readobj --symbols --dyn-syms %t.multiple 2>&1 | \
|
|
# RUN: FileCheck %s -DFILE=%t.multiple --check-prefix=MULTIPLE-LLVM
|
|
|
|
# MULTIPLE-GNU: warning: '[[FILE]]': multiple SHT_SYMTAB_SHNDX sections are linked to SHT_SYMTAB_SHNDX section with index 6
|
|
# MULTIPLE-GNU: Symbol table '.dynsym' contains 3 entries:
|
|
# MULTIPLE-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
|
|
# MULTIPLE-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
|
|
# MULTIPLE-GNU-NEXT: 1: 00000000 0 NOTYPE LOCAL DEFAULT 3 dynsym1
|
|
# MULTIPLE-GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT 2 dynsym2
|
|
|
|
# MULTIPLE-LLVM: Symbol {
|
|
# MULTIPLE-LLVM: Name: dynsym1 (9)
|
|
# MULTIPLE-LLVM-NEXT: Value: 0x0
|
|
# MULTIPLE-LLVM-NEXT: Size: 0
|
|
# MULTIPLE-LLVM-NEXT: Binding: Local (0x0)
|
|
# MULTIPLE-LLVM-NEXT: Type: None (0x0)
|
|
# MULTIPLE-LLVM-NEXT: Other: 0
|
|
# MULTIPLE-LLVM-NEXT: Section: .section3 (0x3)
|
|
# MULTIPLE-LLVM-NEXT: }
|
|
# MULTIPLE-LLVM-NEXT: Symbol {
|
|
# MULTIPLE-LLVM-NEXT: Name: dynsym2 (1)
|
|
# MULTIPLE-LLVM-NEXT: Value: 0x0
|
|
# MULTIPLE-LLVM-NEXT: Size: 0
|
|
# MULTIPLE-LLVM-NEXT: Binding: Local (0x0)
|
|
# MULTIPLE-LLVM-NEXT: Type: None (0x0)
|
|
# MULTIPLE-LLVM-NEXT: Other: 0
|
|
# MULTIPLE-LLVM-NEXT: Section: .section2 (0x2)
|
|
# MULTIPLE-LLVM-NEXT: }
|
|
|
|
## In this case we have a SHT_SYMTAB_SHNDX section placed right before
|
|
## the end of the file. This table is broken: it contains fewer entries than
|
|
## the number of dynamic symbols.
|
|
## Check we report a warning when trying to read an extended symbol index past
|
|
## the end of the file.
|
|
|
|
# RUN: yaml2obj --docnum=2 %s -o %t.pastend
|
|
# RUN: llvm-readelf --dyn-syms %t.pastend 2>&1 | \
|
|
# RUN: FileCheck %s -DFILE=%t.pastend --check-prefix=PASTEND-GNU --implicit-check-not=warning:
|
|
# RUN: llvm-readobj --dyn-syms %t.pastend 2>&1 | \
|
|
# RUN: FileCheck %s -DFILE=%t.pastend --check-prefix=PASTEND-LLVM --implicit-check-not=warning:
|
|
|
|
# PASTEND-GNU: 1: 00000000 0 NOTYPE LOCAL DEFAULT 1 dynsym1
|
|
# PASTEND-GNU-NEXT: warning: '[[FILE]]': unable to read an extended symbol table at index 2: can't read past the end of the file
|
|
# PASTEND-GNU-NEXT: 2: 00000000 0 NOTYPE LOCAL DEFAULT RSV[0xffff] dynsym2
|
|
|
|
# PASTEND-LLVM: Symbol {
|
|
# PASTEND-LLVM: Name: dynsym2 (1)
|
|
# PASTEND-LLVM-NEXT: Value: 0x0
|
|
# PASTEND-LLVM-NEXT: Size: 0
|
|
# PASTEND-LLVM-NEXT: Binding: Local (0x0)
|
|
# PASTEND-LLVM-NEXT: Type: None (0x0)
|
|
# PASTEND-LLVM-NEXT: Other: 0
|
|
# PASTEND-LLVM-NEXT: warning: '[[FILE]]': unable to read an extended symbol table at index 2: can't read past the end of the file
|
|
# PASTEND-LLVM-NEXT: Section: Reserved (0xFFFF)
|
|
# PASTEND-LLVM-NEXT: }
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS32
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Sections:
|
|
- Name: .section1
|
|
Type: SHT_PROGBITS
|
|
- Name: .section2
|
|
Type: SHT_PROGBITS
|
|
- Name: .dynamic
|
|
Type: SHT_DYNAMIC
|
|
Flags: [ SHF_ALLOC ]
|
|
Address: 0x1000
|
|
Offset: 0x1000
|
|
Entries:
|
|
- Tag: DT_SYMTAB
|
|
Value: 0x1500
|
|
- Tag: DT_HASH
|
|
Value: 0x1600
|
|
- Tag: DT_STRTAB
|
|
Value: 0x1700
|
|
- Tag: DT_STRSZ
|
|
Value: 17 ## ".dynsym1.dynsym2."
|
|
- Tag: DT_SYMTAB_SHNDX
|
|
Value: 0x2000
|
|
- Tag: DT_NULL
|
|
Value: 0
|
|
- Name: .dynsym
|
|
Type: SHT_DYNSYM
|
|
Flags: [ SHF_ALLOC ]
|
|
Offset: 0x1500
|
|
Address: 0x1500
|
|
## We need the .hash table to infer the number
|
|
## of dynamic symbols.
|
|
- Name: .hash
|
|
Type: SHT_HASH
|
|
Flags: [ SHF_ALLOC ]
|
|
Offset: 0x1600
|
|
Address: 0x1600
|
|
Bucket: [ 1 ]
|
|
Chain: [ 1, 2, 3 ]
|
|
- Name: .dynstr
|
|
Type: SHT_STRTAB
|
|
Flags: [ SHF_ALLOC ]
|
|
Offset: 0x1700
|
|
Address: 0x1700
|
|
- Name: .strtab
|
|
Type: SHT_STRTAB
|
|
- Name: .symtab_shndx
|
|
Type: SHT_SYMTAB_SHNDX
|
|
Flags: [ SHF_ALLOC ]
|
|
Entries: [ 0, 1 ]
|
|
Offset: 0x2000
|
|
Address: 0x2000
|
|
- Type: SectionHeaderTable
|
|
NoHeaders: true
|
|
DynamicSymbols:
|
|
- Name: dynsym1
|
|
Index: SHN_XINDEX
|
|
- Name: dynsym2
|
|
Index: SHN_XINDEX
|
|
ProgramHeaders:
|
|
- Type: PT_LOAD
|
|
VAddr: 0x1000
|
|
FirstSec: .dynamic
|
|
LastSec: .symtab_shndx
|
|
- Type: PT_DYNAMIC
|
|
VAddr: 0x1000
|
|
FirstSec: .dynamic
|
|
LastSec: .dynamic
|