dynamic-malformed.test 8.45 KB
## 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 -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN
# RUN: llvm-readelf --all %t.bad-size 2>&1 \
# RUN:   | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN-GNU

# WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16)
# WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16)
# WARN: warning: '[[FILE]]': no valid dynamic table was found
# WARN-EMPTY:
# WARN: File:
# WARN: Symbols [
# WARN: ]
# WARN: ProgramHeaders [

# WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16)
# WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16)
# WARN-GNU: warning: '[[FILE]]': no valid dynamic table was found
# WARN-GNU-NEXT: ELF Header:
# WARN-GNU:      Symbol table '.symtab' contains 1 entries:
# WARN-GNU:        0:

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_EXEC
  Machine: EM_X86_64
Sections:
  - Name:    .dynamic
    Type:    SHT_DYNAMIC
    Address: 0x1000
    Content: "01234567"
Symbols: []
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
Symbols: []
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
Symbols: []
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 -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR
# RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR
# BAD-STRTAB-ERR: warning: '[[FILE]]': 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
Symbols: []
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 -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA
# RUN: llvm-readelf --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA-GNU

# CHECK: warning: '[[FILE]]': 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 0xb0 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
Symbols: []
ProgramHeaders:
  - Type: PT_LOAD
    VAddr: 0x1000
    Sections:
      - Section: .dynamic
  - Type: PT_DYNAMIC
    VAddr: 0x1000
    Sections:
      - Section: .dynamic