blob: c4ac2f8325fc4be5c9753a5ef8b87e2e92798652 [file] [log] [blame]
## In this test we test that dynamic symbols are dumped as expected.
## Case 1: Dynamic symbol table found via the DT_SYMTAB dynamic tag.
# RUN: yaml2obj --docnum=1 %s -o %t1.so
# RUN: llvm-readobj --dyn-symbols %t1.so 2>&1 \
# RUN: | FileCheck %s --implicit-check-not="warning:" --check-prefix=DYNSYMS-LLVM
# RUN: llvm-readelf --dyn-symbols %t1.so 2>&1 \
# RUN: | FileCheck %s --implicit-check-not="warning:" --check-prefix=DYNSYMS-GNU
# DYNSYMS-LLVM: DynamicSymbols [
# DYNSYMS-LLVM-NEXT: Symbol {
# DYNSYMS-LLVM-NEXT: Name: (0)
# DYNSYMS-LLVM-NEXT: Value: 0x0
# DYNSYMS-LLVM-NEXT: Size: 0
# DYNSYMS-LLVM-NEXT: Binding: Local (0x0)
# DYNSYMS-LLVM-NEXT: Type: None (0x0)
# DYNSYMS-LLVM-NEXT: Other: 0
# DYNSYMS-LLVM-NEXT: Section: Undefined (0x0)
# DYNSYMS-LLVM-NEXT: }
# DYNSYMS-LLVM-NEXT: Symbol {
# DYNSYMS-LLVM-NEXT: Name: foo (5)
# DYNSYMS-LLVM-NEXT: Value: 0x0
# DYNSYMS-LLVM-NEXT: Size: 0
# DYNSYMS-LLVM-NEXT: Binding: Local (0x0)
# DYNSYMS-LLVM-NEXT: Type: None (0x0)
# DYNSYMS-LLVM-NEXT: Other: 0
# DYNSYMS-LLVM-NEXT: Section: Undefined (0x0)
# DYNSYMS-LLVM-NEXT: }
# DYNSYMS-LLVM-NEXT: Symbol {
# DYNSYMS-LLVM-NEXT: Name: bar (1)
# DYNSYMS-LLVM-NEXT: Value: 0x0
# DYNSYMS-LLVM-NEXT: Size: 0
# DYNSYMS-LLVM-NEXT: Binding: Local (0x0)
# DYNSYMS-LLVM-NEXT: Type: None (0x0)
# DYNSYMS-LLVM-NEXT: Other: 0
# DYNSYMS-LLVM-NEXT: Section: Undefined (0x0)
# DYNSYMS-LLVM-NEXT: }
# DYNSYMS-LLVM-NEXT: ]
# DYNSYMS-GNU: Symbol table '.dynsym' contains 3 entries:
# DYNSYMS-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
# DYNSYMS-GNU-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
# DYNSYMS-GNU-NEXT: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo
# DYNSYMS-GNU-NEXT: 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND bar
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMTAB
Value: 0x100
- Tag: DT_NULL
Value: 0
- Name: .dynsym
Type: SHT_DYNSYM
Address: 0x100
DynamicSymbols:
- Name: foo
- Name: bar
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x100
Sections:
- Section: .dynsym
## Case 2: Check the output for aliases.
## a) Check the two-letter alias --dt is equivalent to the --dyn-symbols
## full flag name.
# RUN: llvm-readobj --dt %t1.so > %t.readobj-dt-alias
# RUN: llvm-readobj --dyn-symbols %t1.so > %t.readobj-dt-no-alias
# RUN: cmp %t.readobj-dt-alias %t.readobj-dt-no-alias
## b) Check --dyn-syms equals --dyn-symbols, --dt for llvm-readobj.
# RUN: llvm-readobj --dyn-syms %t1.so > %t.readobj-dyn-syms
# RUN: cmp %t.readobj-dt-alias %t.readobj-dyn-syms
## c) Check --dyn-syms equals --dyn-symbols for llvm-readelf.
# RUN: llvm-readelf --dyn-syms %t1.so > %t.readelf-dyn-syms
# RUN: llvm-readelf --dyn-symbols %t1.so > %t.readelf-dyn-symbols
# RUN: cmp %t.readelf-dyn-symbols %t.readelf-dyn-syms
## Case 3: Check that we are able to dump the dynamic symbol table even when we have no program headers.
## In this case we find the table by it's type (SHT_DYNSYM) and ignore the DT_SYMTAB value.
# RUN: yaml2obj --docnum=2 %s -o %t2.so
# RUN: llvm-readobj %t2.so --dyn-symbols | FileCheck %s --check-prefix=NOPHDRS-LLVM
# RUN: llvm-readelf %t2.so --dyn-symbols | FileCheck %s --check-prefix=NOPHDRS-GNU
# NOPHDRS-LLVM: Name: foo
# NOPHDRS-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMTAB
Value: 0xffff1234
- Tag: DT_NULL
Value: 0
DynamicSymbols:
- Name: foo
## Case 4: Check we report a warning when there is no SHT_DYNSYM section and we can't map the DT_SYMTAB value
## to an address because of the absence of a corresponding PT_LOAD program header.
# RUN: yaml2obj --docnum=3 %s -o %t3.so
# RUN: llvm-readobj %t3.so --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t3.so --check-prefixes=NOSHT-DYNSYM,NOSHT-DYNSYM-LLVM
# RUN: llvm-readelf %t3.so --dyn-symbols 2>&1 | FileCheck %s -DFILE=%t3.so --check-prefix=NOSHT-DYNSYM
# NOSHT-DYNSYM: warning: '[[FILE]]': Unable to parse DT_SYMTAB: virtual address is not in any segment: 0x0
# NOSHT-DYNSYM-LLVM: DynamicSymbols [
# NOSHT-DYNSYM-LLVM-NEXT: ]
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynsym
Type: SHT_PROGBITS
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMTAB
Value: 0
- Tag: DT_NULL
Value: 0
DynamicSymbols:
- Name: foo
## Case 5: Check that when we can't map the value of the DT_SYMTAB tag to an address, we report a warning and
## use the information in the section header table to locate the dynamic symbol table.
# RUN: yaml2obj --docnum=4 %s -o %t4.so
# RUN: llvm-readobj %t4.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefixes=BROKEN-DTSYMTAB,BROKEN-DTSYMTAB-LLVM
# RUN: llvm-readelf %t4.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t4.so %s --check-prefixes=BROKEN-DTSYMTAB,BROKEN-DTSYMTAB-GNU
# BROKEN-DTSYMTAB: warning: '[[FILE]]': Unable to parse DT_SYMTAB: virtual address is not in any segment: 0xffff1234
# BROKEN-DTSYMTAB-LLVM: Name: foo
# BROKEN-DTSYMTAB-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMTAB
Value: 0xffff1234
- Tag: DT_NULL
Value: 0
DynamicSymbols:
- Name: foo
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x0000
Sections:
- Section: .dynsym
## Case 6: Check that if we can get the location of the dynamic symbol table using both the DT_SYMTAB value
## and the section headers table then we prefer the former and report a warning.
# RUN: yaml2obj --docnum=5 %s -o %t5.so
# RUN: llvm-readobj %t5.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefixes=PREFER-DTSYMTAB,PREFER-DTSYMTAB-LLVM
# RUN: llvm-readelf %t5.so --dyn-symbols 2>&1 | FileCheck -DFILE=%t5.so %s --check-prefixes=PREFER-DTSYMTAB,PREFER-DTSYMTAB-GNU
# PREFER-DTSYMTAB: warning: '[[FILE]]': SHT_DYNSYM section header and DT_SYMTAB disagree about the location of the dynamic symbol table
# PREFER-DTSYMTAB-LLVM: Name: o
# PREFER-DTSYMTAB-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND o
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMTAB
Value: 0x0
- Tag: DT_NULL
Value: 0
- Name: .dynsym
Type: SHT_DYNSYM
- Name: .mydynsym
Type: SHT_DYNSYM
## The Content describes 2 symbols: zero symbol and symbol with st_name == 3.
Content: "000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000"
DynamicSymbols:
- Name: foo
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x0000
Sections:
- Section: .mydynsym
## Case 7: Check how we dump versioned symbols. Use both -V and --dyn-symbols
## to check that printed version is consistent.
# RUN: yaml2obj %s --docnum=6 -o %t6
# RUN: llvm-readobj -V --dyn-symbols %t6 | FileCheck %s --check-prefix=VERSIONED-LLVM
# RUN: llvm-readelf -V --dyn-symbols %t6 | FileCheck %s --check-prefix=VERSIONED-GNU
# VERSIONED-LLVM: Symbol {
# VERSIONED-LLVM: Name: foo (16)
# VERSIONED-LLVM-NEXT: Value: 0x0
# VERSIONED-LLVM-NEXT: Size: 0
# VERSIONED-LLVM-NEXT: Binding: Local (0x0)
# VERSIONED-LLVM-NEXT: Type: None (0x0)
# VERSIONED-LLVM-NEXT: Other: 0
# VERSIONED-LLVM-NEXT: Section: Undefined (0x0)
# VERSIONED-LLVM-NEXT: }
# VERSIONED-LLVM-NEXT: Symbol {
# VERSIONED-LLVM-NEXT: Name: bar@@Default (12)
# VERSIONED-LLVM-NEXT: Value: 0x0
# VERSIONED-LLVM-NEXT: Size: 0
# VERSIONED-LLVM-NEXT: Binding: Local (0x0)
# VERSIONED-LLVM-NEXT: Type: None (0x0)
# VERSIONED-LLVM-NEXT: Other: 0
# VERSIONED-LLVM-NEXT: Section: Undefined (0x0)
# VERSIONED-LLVM-NEXT: }
# VERSIONED-LLVM-NEXT: Symbol {
# VERSIONED-LLVM-NEXT: Name: zed@NonDefault (20)
# VERSIONED-LLVM-NEXT: Value: 0x0
# VERSIONED-LLVM-NEXT: Size: 0
# VERSIONED-LLVM-NEXT: Binding: Local (0x0)
# VERSIONED-LLVM-NEXT: Type: None (0x0)
# VERSIONED-LLVM-NEXT: Other: 0
# VERSIONED-LLVM-NEXT: Section: Undefined (0x0)
# VERSIONED-LLVM-NEXT: }
# VERSIONED-LLVM: VersionSymbols [
# VERSIONED-LLVM: Name: foo
# VERSIONED-LLVM: Name: bar@@Default
# VERSIONED-LLVM: Name: zed@NonDefault
# VERSIONED-GNU: Num: Value Size Type Bind Vis Ndx Name
# VERSIONED-GNU: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND foo
# VERSIONED-GNU-NEXT: 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND bar@@Default
# VERSIONED-GNU-NEXT: 3: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND zed@NonDefault
# VERSIONED-GNU: 000: 0 (*local*) 1 (*global*) 2 (Default) 3h(NonDefault)
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .gnu.version
Type: SHT_GNU_versym
Flags: [ SHF_ALLOC ]
Link: .dynsym
AddressAlign: 0x2
EntSize: 0x2
## 0x8000 is a special VERSYM_HIDDEN bit.
Entries: [ 0, 1, 2, 0x8003 ]
- Name: .gnu.version_d
Type: SHT_GNU_verdef
Flags: [ SHF_ALLOC ]
Link: .dynstr
AddressAlign: 0x4
Info: 0x2
Entries:
- Version: 1
Flags: 0
VersionNdx: 2
Hash: 0
Names:
- Default
- Version: 1
Flags: 0
VersionNdx: 3
Hash: 0
Names:
- NonDefault
DynamicSymbols:
- Name: foo
- Name: bar
- Name: zed
## Case 8: Check what we print when:
## a) The dynamic symbol table does not exist.
# RUN: yaml2obj %s --docnum=7 -o %t7
# RUN: llvm-readobj --dyn-symbols %t7 | FileCheck %s --check-prefix=NO-DYNSYM-LLVM
# RUN: llvm-readelf --dyn-symbols %t7 | count 0
## b) The dynamic symbol table has a size of 0.
# RUN: yaml2obj %s --docnum=8 -o %t8
# RUN: llvm-readobj --dyn-symbols %t8 | FileCheck %s --check-prefix=NO-DYNSYM-LLVM
# RUN: llvm-readelf --dyn-symbols %t8 | count 0
## c) The dynamic symbol table only contains the null symbol.
# RUN: yaml2obj %s --docnum=9 -o %t9
# RUN: llvm-readobj --dyn-symbols %t9 | FileCheck %s --check-prefix=DYNSYM-EMPTY-LLVM
# RUN: llvm-readelf --dyn-symbols %t9 | FileCheck %s --check-prefix=DYNSYM-EMPTY-GNU
# NO-DYNSYM-LLVM: DynamicSymbols [
# NO-DYNSYM-LLVM-NEXT: ]
# DYNSYM-EMPTY-LLVM: DynamicSymbols [
# DYNSYM-EMPTY-LLVM-NEXT: Symbol {
# DYNSYM-EMPTY-LLVM-NEXT: Name: (0)
# DYNSYM-EMPTY-LLVM-NEXT: Value: 0x0
# DYNSYM-EMPTY-LLVM-NEXT: Size: 0
# DYNSYM-EMPTY-LLVM-NEXT: Binding: Local (0x0)
# DYNSYM-EMPTY-LLVM-NEXT: Type: None (0x0)
# DYNSYM-EMPTY-LLVM-NEXT: Other: 0
# DYNSYM-EMPTY-LLVM-NEXT: Section: Undefined (0x0)
# DYNSYM-EMPTY-LLVM-NEXT: }
# DYNSYM-EMPTY-LLVM-NEXT: ]
# DYNSYM-EMPTY-GNU: Symbol table '.dynsym' contains 1 entries:
# DYNSYM-EMPTY-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
# DYNSYM-EMPTY-GNU-NEXT: 0: 00000000 0 NOTYPE LOCAL DEFAULT UND
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
- Name: .dynsym
Type: SHT_DYNSYM
Size: 0
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
DynamicSymbols: []
## Case 9: Check what we print when:
## a) The size of the dynamic symbol table is not a multiple of its entry size.
# RUN: yaml2obj %s --docnum=10 -o %t10
# RUN: llvm-readobj --dyn-symbols %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=DYNSYM-SIZE-INVALID1
# RUN: llvm-readelf --dyn-symbols %t10 2>&1 | FileCheck %s -DFILE=%t10 --check-prefix=DYNSYM-SIZE-INVALID1
# DYNSYM-SIZE-INVALID1: warning: '[[FILE]]': section with index 1 has invalid size (0x1) or entry size (0x10)
## b) The same, but the DT_SYMTAB tag is present. In this case the dynamic tag has priority over the
## information about a location and an entity size of the dynamic symbol table from the section header.
## The code uses sizeof(Elf_Sym) for an entity size, so it can't be incorrect and
## the message printed is a bit shorter.
# RUN: yaml2obj %s --docnum=11 -o %t11
# RUN: llvm-readobj --dyn-symbols %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=DYNSYM-SIZE-INVALID2
# RUN: llvm-readelf --dyn-symbols %t11 2>&1 | FileCheck %s -DFILE=%t11 --check-prefix=DYNSYM-SIZE-INVALID2
# DYNSYM-SIZE-INVALID2: warning: '[[FILE]]': section with index 2 has invalid size (0x1){{$}}
## c) In the case when the DT_SYMENT tag is present, we report when it's value does not match the
# value of the symbol size for the platform.
# RUN: yaml2obj %s -D BITS=32 --docnum=12 -o %t12
# RUN: llvm-readobj --dyn-symbols %t12 2>&1 | FileCheck %s -DFILE=%t12 --check-prefix=DYNSYM-SIZE-INVALID3
# RUN: llvm-readelf --dyn-symbols %t12 2>&1 | FileCheck %s -DFILE=%t12 --check-prefix=DYNSYM-SIZE-INVALID3
# RUN: yaml2obj %s -D BITS=64 --docnum=12 -o %t13
# RUN: llvm-readobj --dyn-symbols %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=DYNSYM-SIZE-INVALID4
# RUN: llvm-readelf --dyn-symbols %t13 2>&1 | FileCheck %s -DFILE=%t13 --check-prefix=DYNSYM-SIZE-INVALID4
# DYNSYM-SIZE-INVALID3: warning: '[[FILE]]': DT_SYMENT value of 0x123 is not the size of a symbol (0x10){{$}}
# DYNSYM-SIZE-INVALID4: warning: '[[FILE]]': DT_SYMENT value of 0x123 is not the size of a symbol (0x18){{$}}
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
- Name: .dynsym
Type: SHT_DYNSYM
Size: 0x1
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMTAB
Value: 0x100
- Tag: DT_NULL
Value: 0
- Name: .dynsym
Type: SHT_DYNSYM
Address: 0x100
Size: 0x1
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x100
Sections:
- Section: .dynsym
--- !ELF
FileHeader:
Class: ELFCLASS[[BITS]]
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Entries:
- Tag: DT_SYMENT
Value: 0x123
- Tag: DT_NULL
Value: 0
## Check we report a warning when the DT_STRSZ value is broken so that the dynamic string
## table goes past the end of the file. Document we stop dumping symbols and report an error.
# RUN: yaml2obj %s --docnum=13 -o %t14
# RUN: llvm-readobj --dyn-symbols %t14 2>&1 | \
# RUN: FileCheck %s -DFILE=%t14 --check-prefix=DYNSTR-INVALID-LLVM
# RUN: llvm-readelf --dyn-symbols %t14 2>&1 | \
# RUN: FileCheck %s -DFILE=%t14 --check-prefix=DYNSTR-INVALID-GNU
# DYNSTR-INVALID-LLVM: warning: '[[FILE]]': the dynamic string table at 0x78 goes past the end of the file (0x2a8) with DT_STRSZ = 0xffffffff
# DYNSTR-INVALID-LLVM: DynamicSymbols [
# DYNSTR-INVALID-LLVM-NEXT: Symbol {
# DYNSTR-INVALID-LLVM-NEXT: Name: (0)
# DYNSTR-INVALID-LLVM-NEXT: Value: 0x0
# DYNSTR-INVALID-LLVM-NEXT: Size: 0
# DYNSTR-INVALID-LLVM-NEXT: Binding: Local (0x0)
# DYNSTR-INVALID-LLVM-NEXT: Type: None (0x0)
# DYNSTR-INVALID-LLVM-NEXT: Other: 0
# DYNSTR-INVALID-LLVM-NEXT: Section: Undefined (0x0)
# DYNSTR-INVALID-LLVM-NEXT: }
# DYNSTR-INVALID-LLVM-NEXT: warning: '[[FILE]]': st_name (0xffffff00) is past the end of the string table of size 0x6
# DYNSTR-INVALID-LLVM-NEXT: Symbol {
# DYNSTR-INVALID-LLVM-NEXT: Name: <?> (4294967040)
# DYNSTR-INVALID-LLVM-NEXT: Value: 0x0
# DYNSTR-INVALID-LLVM-NEXT: Size: 0
# DYNSTR-INVALID-LLVM-NEXT: Binding: Local (0x0)
# DYNSTR-INVALID-LLVM-NEXT: Type: None (0x0)
# DYNSTR-INVALID-LLVM-NEXT: Other: 0
# DYNSTR-INVALID-LLVM-NEXT: Section: Undefined (0x0)
# DYNSTR-INVALID-LLVM-NEXT: }
# DYNSTR-INVALID-LLVM-NEXT: Symbol {
# DYNSTR-INVALID-LLVM-NEXT: Name: test (1)
# DYNSTR-INVALID-LLVM-NEXT: Value: 0x0
# DYNSTR-INVALID-LLVM-NEXT: Size: 0
# DYNSTR-INVALID-LLVM-NEXT: Binding: Local (0x0)
# DYNSTR-INVALID-LLVM-NEXT: Type: None (0x0)
# DYNSTR-INVALID-LLVM-NEXT: Other: 0
# DYNSTR-INVALID-LLVM-NEXT: Section: Undefined (0x0)
# DYNSTR-INVALID-LLVM-NEXT: }
# DYNSTR-INVALID-LLVM-NEXT: ]
# DYNSTR-INVALID-GNU: warning: '[[FILE]]': the dynamic string table at 0x78 goes past the end of the file (0x2a8) with DT_STRSZ = 0xffffffff
# DYNSTR-INVALID-GNU: Symbol table '.dynsym' contains 3 entries:
# DYNSTR-INVALID-GNU-NEXT: Num: Value Size Type Bind Vis Ndx Name
# DYNSTR-INVALID-GNU-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
# DYNSTR-INVALID-GNU-NEXT: warning: '[[FILE]]': st_name (0xffffff00) is past the end of the string table of size 0x6
# DYNSTR-INVALID-GNU-NEXT: 1: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND <?>
# DYNSTR-INVALID-GNU-NEXT: 2: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND test
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
Content: '007465737400' ## '\0', 'test', '\0'
- Name: .dynamic
Type: SHT_DYNAMIC
Flags: [ SHF_ALLOC ]
Link: .dynstr
Entries:
- Tag: DT_STRTAB
Value: 0x0
- Tag: DT_STRSZ
Value: 0xffffffff
- Tag: DT_NULL
Value: 0x0
DynamicSymbols:
- StName: 0xffffff00
## An arbitrary valid symbol to document we report an error before dumping it.
- StName: 0x1
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_R ]
Sections:
- Section: .dynstr
- Section: .dynamic
## Check we report a warning when the entry size of the dynamic symbol table is zero.
# RUN: yaml2obj %s --docnum=14 -o %t15
# RUN: llvm-readobj --dyn-symbols %t15 2>&1 | FileCheck %s -DFILE=%t15 --check-prefix=DYNSYM-ZERO-ENTSIZE-LLVM
# RUN: llvm-readelf --dyn-symbols %t15 2>&1 | \
# RUN: FileCheck %s -DFILE=%t15 --check-prefix=DYNSYM-ZERO-ENTSIZE-GNU --implicit-check-not="Symbol table"
# DYNSYM-ZERO-ENTSIZE-LLVM: DynamicSymbols [
# DYNSYM-ZERO-ENTSIZE-LLVM-NEXT: warning: '[[FILE]]': section with index 1 has invalid size (0x10) or entry size (0x0)
# DYNSYM-ZERO-ENTSIZE-LLVM-NEXT: ]
# DYNSYM-ZERO-ENTSIZE-GNU: warning: '[[FILE]]': section with index 1 has invalid size (0x10) or entry size (0x0)
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_386
Sections:
- Name: .dynsym
Type: SHT_DYNSYM
EntSize: 0x0