blob: 22315db7a6ebe8983ea7b0f317eab08d14f9305c [file] [log] [blame]
## Test handling of a dynamic section size which is not a multiple of its entry size.
## Test the full output to demonstrate how we print the warnings.
# RUN: yaml2obj %s --docnum=1 -o %t.bad-size
# RUN: llvm-readobj --all %t.bad-size 2>&1 \
# RUN: | FileCheck %s --implicit-check-not=warning --check-prefix WARN
# RUN: llvm-readelf --all %t.bad-size 2>&1 \
# RUN: | FileCheck %s --implicit-check-not=warning --check-prefix WARN-GNU
# WARN-NOT: warning
# WARN: warning: invalid section size (4) or entity size (16)
# WARN-EMPTY:
# WARN-NEXT: File:
# WARN: Symbols [
# WARN: ]
# WARN-EMPTY:
## A warning is printed at the place where a normal dynamic table should be.
# WARN-NEXT: warning: invalid section size (4) or entity size (16)
# WARN-NEXT: ProgramHeaders [
# WARN-GNU-NOT: warning
# WARN-GNU: warning: invalid section size (4) or entity size (16)
# WARN-GNU-NEXT: ELF Header:
# WARN-GNU: Symbol table '.symtab' contains 1 entries:
# WARN-GNU: 0:
# WARN-GNU-EMPTY:
## A warning is printed at the place where a normal dynamic table should be.
# WARN-GNU: warning: invalid section size (4) or entity size (16)
# WARN-GNU-EMPTY:
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Address: 0x1000
Content: "01234567"
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x1000
Sections:
- Section: .dynamic
- Type: PT_DYNAMIC
VAddr: 0x1000
Sections:
- Section: .dynamic
## Test handling of a .dynamic section with an invalid entsize (i.e. not 2 * sizeof(Elf_Dyn)).
# RUN: yaml2obj %s --docnum=2 -o %t.bad-entsize
# RUN: llvm-readobj --dynamic-table %t.bad-entsize | FileCheck %s --check-prefix BAD-ENTSIZE-LLVM
# RUN: llvm-readelf --dynamic-table %t.bad-entsize | FileCheck %s --check-prefix BAD-ENTSIZE-GNU
# BAD-ENTSIZE-LLVM: DynamicSection [ (2 entries)
# BAD-ENTSIZE-LLVM-NEXT: Tag Type Name/Value
# BAD-ENTSIZE-LLVM-NEXT: 0x0000000000000015 DEBUG 0x0
# BAD-ENTSIZE-LLVM-NEXT: 0x0000000000000000 NULL 0x0
# BAD-ENTSIZE-LLVM-NEXT: ]
# BAD-ENTSIZE-GNU: Dynamic section at offset 0x{{.*}} contains 2 entries:
# BAD-ENTSIZE-GNU-NEXT: Tag Type Name/Value
# BAD-ENTSIZE-GNU-NEXT: 0x0000000000000015 (DEBUG) 0x0
# BAD-ENTSIZE-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Address: 0x1000
EntSize: 0x2
Entries:
- Tag: DT_DEBUG
Value: 0
- Tag: DT_NULL
Value: 0
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x1000
Sections:
- Section: .dynamic
- Type: PT_DYNAMIC
VAddr: 0x1000
Sections:
- Section: .dynamic
## Test handling of string references pointing past the end of the dynamic string table.
# RUN: yaml2obj %s --docnum=3 -o %t.bad-string
# RUN: llvm-readobj --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-LLVM
# RUN: llvm-readelf --dynamic-table %t.bad-string | FileCheck %s --check-prefix BAD-STRING-GNU
# BAD-STRING-LLVM: 0x000000000000000A STRSZ 1 (bytes)
# BAD-STRING-LLVM: 0x0000000000000001 NEEDED Shared library: [<Invalid offset 0x1>]
# BAD-STRING-LLVM: 0x000000007FFFFFFF FILTER Filter library: [<Invalid offset 0x1>]
# BAD-STRING-LLVM: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [<Invalid offset 0x1>]
# BAD-STRING-LLVM: 0x000000007FFFFFFE USED Not needed object: [<Invalid offset 0x1>]
# BAD-STRING-LLVM: 0x000000000000000E SONAME Library soname: [<Invalid offset 0x1>]
# BAD-STRING-LLVM: 0x000000000000000F RPATH Library rpath: [<Invalid offset 0x1>]
# BAD-STRING-LLVM: 0x000000000000001D RUNPATH Library runpath: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000000000000a (STRSZ) 1 (bytes)
# BAD-STRING-GNU: 0x0000000000000001 (NEEDED) Shared library: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000007fffffff (FILTER) Filter library: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000007ffffffd (AUXILIARY) Auxiliary library: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000007ffffffe (USED) Not needed object: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000000000000e (SONAME) Library soname: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000000000000f (RPATH) Library rpath: [<Invalid offset 0x1>]
# BAD-STRING-GNU: 0x000000000000001d (RUNPATH) Library runpath: [<Invalid offset 0x1>]
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .dynstr
Type: SHT_STRTAB
Address: 0x1000
- Name: .dynamic
Type: SHT_DYNAMIC
Address: 0x1010
Entries:
- Tag: DT_STRTAB
Value: 0x1000
- Tag: DT_STRSZ
Value: 1
- Tag: DT_NEEDED
Value: 1
- Tag: DT_FILTER
Value: 1
- Tag: DT_AUXILIARY
Value: 1
- Tag: DT_USED
Value: 1
- Tag: DT_SONAME
Value: 1
- Tag: DT_RPATH
Value: 1
- Tag: DT_RUNPATH
Value: 1
- Tag: DT_NULL
Value: 0
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x1000
Sections:
- Section: .dynstr
- Section: .dynamic
- Type: PT_DYNAMIC
VAddr: 0x1010
Sections:
- Section: .dynamic
## Test handling of DT_STRTAB pointing outside the file's address space.
# RUN: yaml2obj %s --docnum=4 -o %t.bad-strtab
# RUN: llvm-readobj --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck %s --check-prefix BAD-STRTAB-ERR
# RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck %s --check-prefix BAD-STRTAB-ERR
# BAD-STRTAB-ERR: warning: Unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000
# RUN: llvm-readobj --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-LLVM
# RUN: llvm-readelf --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-GNU
# BAD-STRTAB-LLVM: LoadName: <String table is empty or was not found>
# BAD-STRTAB-LLVM: 0x0000000000000001 NEEDED Shared library: [<String table is empty or was not found>]
# BAD-STRTAB-GNU: 0x0000000000000001 (NEEDED) Shared library: [<String table is empty or was not found>]
# BAD-STRTAB: NeededLibraries [
# BAD-STRTAB: <String table is empty or was not found>
# BAD-STRTAB: ]
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Address: 0x1000
Entries:
- Tag: DT_STRTAB
Value: 0x2000000
- Tag: DT_STRSZ
Value: 10
- Tag: DT_NEEDED
Value: 1
- Tag: DT_NULL
Value: 0x0
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x1000
Sections:
- Section: .dynamic
- Type: PT_DYNAMIC
VAddr: 0x1000
Sections:
- Section: .dynamic
## Test handling of other d_ptr tags pointing outside the file's address space.
# RUN: yaml2obj %s --docnum=5 -o %t.bad-rela
# RUN: llvm-readobj --dynamic-table %t.bad-rela 2>&1 | FileCheck %s --check-prefixes=CHECK,BAD-RELA
# RUN: llvm-readelf --dynamic-table %t.bad-rela 2>&1 | FileCheck %s --check-prefixes=CHECK,BAD-RELA-GNU
# CHECK: warning: Unable to parse DT_RELA: virtual address is not in any segment: 0x1000000
# BAD-RELA: DynamicSection [ (2 entries)
# BAD-RELA-NEXT: Tag Type Name/Value
# BAD-RELA-NEXT: 0x0000000000000007 RELA 0x1000000
# BAD-RELA-NEXT: 0x0000000000000000 NULL 0x0
# BAD-RELA-NEXT: ]
# BAD-RELA-GNU: Dynamic section at offset 0x1f0 contains 2 entries:
# BAD-RELA-GNU-NEXT: Tag Type Name/Value
# BAD-RELA-GNU-NEXT: 0x0000000000000007 (RELA) 0x1000000
# BAD-RELA-GNU-NEXT: 0x0000000000000000 (NULL) 0x0
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Sections:
- Name: .dynamic
Type: SHT_DYNAMIC
Address: 0x1000
Entries:
- Tag: DT_RELA
Value: 0x1000000
- Tag: DT_NULL
Value: 0x0
ProgramHeaders:
- Type: PT_LOAD
VAddr: 0x1000
Sections:
- Section: .dynamic
- Type: PT_DYNAMIC
VAddr: 0x1000
Sections:
- Section: .dynamic