llvm/llvm/test/tools/llvm-readobj/ELF/dynamic-malformed.test

## 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 PT_DYNAMIC size (0x4){{$}}
# WARN: warning: '[[FILE]]': SHT_DYNAMIC section with index 1 has invalid size (0x4){{$}}
# WARN: warning: '[[FILE]]': no valid dynamic table was found
# WARN-EMPTY:
# WARN: File:
# WARN: ProgramHeaders [
# WARN: Symbols [
# WARN: ]

# WARN-GNU: warning: '[[FILE]]': invalid PT_DYNAMIC size (0x4){{$}}
# WARN-GNU: warning: '[[FILE]]': SHT_DYNAMIC section with index 1 has invalid size (0x4){{$}}
# 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
Sections:
  - Name:    .dynamic
    Type:    SHT_DYNAMIC
    Address: 0x1000
    Content: "01234567"
Symbols: []
ProgramHeaders:
  - Type:     PT_LOAD
    VAddr:    0x1000
    FirstSec: .dynamic
    LastSec:  .dynamic
  - Type:     PT_DYNAMIC
    VAddr:    0x1000
    FirstSec: .dynamic
    LastSec:  .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
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
    FirstSec: .dynamic
    LastSec:  .dynamic
  - Type:     PT_DYNAMIC
    VAddr:    0x1000
    FirstSec: .dynamic
    LastSec:  .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 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix BAD-STRING-LLVM -DFILE=%t.bad-string
# RUN: llvm-readelf --dynamic-table %t.bad-string 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix BAD-STRING-GNU -DFILE=%t.bad-string

# BAD-STRING-LLVM:      warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb6: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM:      LoadName: <?>
# BAD-STRING-LLVM:      DynamicSection [ (10 entries)
# BAD-STRING-LLVM-NEXT:   Tag                Type      Name/Value
# BAD-STRING-LLVM-NEXT:   0x0000000000000005 STRTAB    0x1000
# BAD-STRING-LLVM-NEXT:   0x000000000000000A STRSZ     1 (bytes)
# BAD-STRING-LLVM-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb2: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM-NEXT:   0x0000000000000001 NEEDED    Shared library: [<?>]
# BAD-STRING-LLVM-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb3: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM-NEXT:   0x000000007FFFFFFF FILTER    Filter library: [<?>]
# BAD-STRING-LLVM-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb4: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM-NEXT:   0x000000007FFFFFFD AUXILIARY Auxiliary library: [<?>]
# BAD-STRING-LLVM-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb5: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM-NEXT:   0x000000007FFFFFFE USED      Not needed object: [<?>]
## Note: there is no "string table at offset 0xb0..." warning here, because it was printed earlier.
# BAD-STRING-LLVM-NEXT:   0x000000000000000E SONAME    Library soname: [<?>]
# BAD-STRING-LLVM-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb7: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM-NEXT:   0x000000000000000F RPATH     Library rpath: [<?>]
# BAD-STRING-LLVM-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb8: it goes past the end of the table (0xb1)
# BAD-STRING-LLVM-NEXT:   0x000000000000001D RUNPATH   Library runpath: [<?>]
# BAD-STRING-LLVM-NEXT:   0x0000000000000000 NULL      0x0
# BAD-STRING-LLVM-NEXT: ]

# BAD-STRING-GNU:      Dynamic section at offset 0xb1 contains 10 entries:
# BAD-STRING-GNU-NEXT:   Tag                Type        Name/Value
# BAD-STRING-GNU-NEXT:   0x0000000000000005 (STRTAB)    0x1000
# BAD-STRING-GNU-NEXT:   0x000000000000000a (STRSZ)     1 (bytes)
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb2: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x0000000000000001 (NEEDED)    Shared library: [<?>]
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb3: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x000000007fffffff (FILTER)    Filter library: [<?>]
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb4: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x000000007ffffffd (AUXILIARY) Auxiliary library: [<?>]
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb5: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x000000007ffffffe (USED)      Not needed object: [<?>]
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb6: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x000000000000000e (SONAME)    Library soname: [<?>]
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb7: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x000000000000000f (RPATH)     Library rpath: [<?>]
# BAD-STRING-GNU-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb8: it goes past the end of the table (0xb1)
# BAD-STRING-GNU-NEXT:   0x000000000000001d (RUNPATH)   Library runpath: [<?>]
# BAD-STRING-GNU-NEXT:   0x0000000000000000 (NULL)      0x0

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
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: 2
      - Tag:   DT_FILTER
        Value: 3
      - Tag:   DT_AUXILIARY
        Value: 4
      - Tag:   DT_USED
        Value: 5
      - Tag:   DT_SONAME
        Value: 6
      - Tag:   DT_RPATH
        Value: 7
      - Tag:   DT_RUNPATH
        Value: 8
      - Tag:   DT_NULL
        Value: 0
Symbols: []
ProgramHeaders:
  - Type:     PT_LOAD
    VAddr:    0x1000
    FirstSec: .dynstr
    LastSec:  .dynamic
  - Type:     PT_DYNAMIC
    VAddr:    0x1010
    FirstSec: .dynamic
    LastSec:  .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 | \
# RUN:   FileCheck -DFILE=%t.bad-strtab %s --implicit-check-not=warning: --check-prefix=BAD-STRTAB-ERR
# RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | \
# RUN:   FileCheck -DFILE=%t.bad-strtab %s --implicit-check-not=warning: --check-prefix=BAD-STRTAB-ERR
# BAD-STRTAB-ERR:    warning: '[[FILE]]': unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000
# BAD-STRTAB-ERR:    warning: '[[FILE]]': string table was not found
# BAD-STRTAB-ERR-NOT:{{.}}

# RUN: llvm-readobj --dynamic-table --needed-libs %t.bad-strtab 2>&1 | \
# RUN:   FileCheck -DFILE=%t.bad-strtab %s --check-prefixes=BAD-STRTAB-ERR2,BAD-STRTAB,BAD-STRTAB-LLVM
# RUN: llvm-readelf --dynamic-table --needed-libs %t.bad-strtab 2>&1 | \
# RUN:   FileCheck -DFILE=%t.bad-strtab %s --check-prefixes=BAD-STRTAB-ERR2,BAD-STRTAB,BAD-STRTAB-GNU

#      BAD-STRTAB-ERR2: warning: '[[FILE]]': unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000
#      BAD-STRTAB-LLVM: LoadName: <Not found>
#           BAD-STRTAB: warning: '[[FILE]]': string table was not found
# BAD-STRTAB-LLVM-NEXT: 0x0000000000000001  NEEDED   Shared library: [<?>]
#  BAD-STRTAB-GNU-NEXT: 0x0000000000000001 (NEEDED)  Shared library: [<?>]
#           BAD-STRTAB: NeededLibraries [
#           BAD-STRTAB:   <?>
#           BAD-STRTAB: ]

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:    .dynamic
    Type:    SHT_DYNAMIC
    Address: 0x1000
    Entries:
## Two DT_STRTAB entries are needed to check that we don't report it twice.
      - Tag:   DT_STRTAB
        Value: 0x2000000
      - 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
    FirstSec: .dynamic
    LastSec:  .dynamic
  - Type:     PT_DYNAMIC
    VAddr:    0x1000
    FirstSec: .dynamic
    LastSec:  .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
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
    FirstSec: .dynamic
    LastSec:  .dynamic
  - Type:     PT_DYNAMIC
    VAddr:    0x1000
    FirstSec: .dynamic
    LastSec:  .dynamic

## Check how we handle cases when the dynamic string table is not null-terminated.

## Case A: the value of the DT_STRSZ tag is equal to the size of
##         the not null-terminated dynamic string table.
# RUN: yaml2obj %s -DSTRSZ=7 --docnum=6 -o %t6
# RUN: llvm-readobj --dynamic-table %t6 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t6 --implicit-check-not=warning: \
# RUN:     --check-prefixes=NOT-TERMINATED,NOT-TERMINATED-LLVM,NOT-TERMINATED-GREQ
# RUN: llvm-readelf --dynamic-table %t6 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t6 --implicit-check-not=warning: \
# RUN:     --check-prefixes=NOT-TERMINATED,NOT-TERMINATED-GNU,NOT-TERMINATED-GREQ

## Case B: the value of the DT_STRSZ tag is less than the size of
##         the not null-terminated dynamic string table.
# RUN: yaml2obj %s -DSTRSZ=6 --docnum=6 -o %t7
# RUN: llvm-readobj --dynamic-table %t7 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t7 --implicit-check-not=warning: \
# RUN:     --check-prefixes=NOT-TERMINATED,NOT-TERMINATED-LLVM,NOT-TERMINATED-LESS
# RUN: llvm-readelf --dynamic-table %t7 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t7 --implicit-check-not=warning: \
# RUN:     --check-prefixes=NOT-TERMINATED,NOT-TERMINATED-GNU,NOT-TERMINATED-LESS

## Case C: the value of the DT_STRSZ tag is one byte larger than the size of
##         the not null-terminated dynamic string table.
# RUN: yaml2obj %s -DSTRSZ=8 --docnum=6 -o %t8
# RUN: llvm-readobj --dynamic-table %t8 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t8 --implicit-check-not=warning: \
# RUN:     --check-prefixes=NOT-TERMINATED,NOT-TERMINATED-LLVM,NOT-TERMINATED-GREQ
# RUN: llvm-readelf --dynamic-table %t8 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t8 --implicit-check-not=warning: \
# RUN:     --check-prefixes=NOT-TERMINATED,NOT-TERMINATED-GNU,NOT-TERMINATED-GREQ

# NOT-TERMINATED-LLVM: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb4: the string table is not null-terminated
# NOT-TERMINATED:      warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb0: the string table is not null-terminated
# NOT-TERMINATED-NEXT: {{[(]?}}NEEDED{{[)]?}}    Shared library: [<?>]
# NOT-TERMINATED-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb1: the string table is not null-terminated
# NOT-TERMINATED-NEXT: {{[(]?}}FILTER{{[)]?}}    Filter library: [<?>]
# NOT-TERMINATED-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb2: the string table is not null-terminated
# NOT-TERMINATED-NEXT: {{[(]?}}AUXILIARY{{[)]?}} Auxiliary library: [<?>]
# NOT-TERMINATED-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb3: the string table is not null-terminated
# NOT-TERMINATED-NEXT: {{[(]?}}USED{{[)]?}}      Not needed object: [<?>]
# NOT-TERMINATED-GNU-NEXT:  warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb4: the string table is not null-terminated
# NOT-TERMINATED-NEXT: {{[(]?}}SONAME{{[)]?}}    Library soname: [<?>]
# NOT-TERMINATED-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb5: the string table is not null-terminated
# NOT-TERMINATED-NEXT: {{[(]?}}RPATH{{[)]?}}     Library rpath: [<?>]
# NOT-TERMINATED-GREQ-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb6: the string table is not null-terminated
# NOT-TERMINATED-LESS-NEXT: warning: '[[FILE]]': string table at offset 0xb0: unable to read the string at 0xb6: it goes past the end of the table (0xb6)
# NOT-TERMINATED-NEXT: {{[(]?}}RUNPATH{{[)]?}}   Library runpath: [<?>]
# NOT-TERMINATED-NEXT: {{[(]?}}NULL{{[)]?}}      0x0

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:    .dynstr
    Type:    SHT_STRTAB
    Address: 0x1000
    Content: '746573742e736f' ## "test.so", not null terminated.
  - Type:    Fill
    Pattern: "61626300" ## 'a', 'b', 'c', '\0'.
    Size:    "4"
  - Name:    .dynamic
    Type:    SHT_DYNAMIC
    Address: 0x1100
    Entries:
      - Tag:   DT_STRTAB
        Value: 0x1000
      - Tag:   DT_STRSZ
        Value: [[STRSZ]]
      - Tag:   DT_NEEDED
        Value: 0
      - Tag:   DT_FILTER
        Value: 1
      - Tag:   DT_AUXILIARY
        Value: 2
      - Tag:   DT_USED
        Value: 3
      - Tag:   DT_SONAME
        Value: 4
      - Tag:   DT_RPATH
        Value: 5
      - Tag:   DT_RUNPATH
        Value: 6
      - Tag:   DT_NULL
        Value: 0
ProgramHeaders:
  - Type:     PT_LOAD
    VAddr:    0x1000
    FirstSec: .dynstr
    LastSec:  .dynamic
  - Type:     PT_DYNAMIC
    VAddr:    0x1100
    FirstSec: .dynamic
    LastSec:  .dynamic

## Check that we emit an appropriate warning when the dynamic string table ends past the end of the file.

## Case A: the value of DT_STRSZ tag is set so that the string table ends
## right before the EOF. No warning should be emitted.
# RUN: yaml2obj %s -DSTRSZ=0x210 --docnum=6 -o %t9.1
# RUN: llvm-readobj --dynamic-table %t9.1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix=BEFORE-THE-EOF
# RUN: llvm-readelf --dynamic-table %t9.1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix=BEFORE-THE-EOF

## Note: The code reads the data in [DT_STRTAB, DT_STRTAB + DT_STRSZ] as the string table
## as normal. Since the file ends with a zero byte, strings are dumped, but if it didn't,
## we'd get <?> printed instead. The important bit is that we don't get the past the end warning.

# BEFORE-THE-EOF:      {{[(]?}}NEEDED{{[)]?}}    Shared library: [test.soabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}FILTER{{[)]?}}    Filter library: [est.soabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}AUXILIARY{{[)]?}} Auxiliary library: [st.soabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}USED{{[)]?}}      Not needed object: [t.soabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}SONAME{{[)]?}}    Library soname: [.soabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}RPATH{{[)]?}}     Library rpath: [soabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}RUNPATH{{[)]?}}   Library runpath: [oabc]
# BEFORE-THE-EOF-NEXT: {{[(]?}}NULL{{[)]?}}      0x0

## Case B: the value of DT_STRSZ tag is set so that the string table goes 1 byte past the EOF.
# RUN: yaml2obj %s -DSTRSZ=0x211 --docnum=6 -o %t9.2
# RUN: llvm-readobj --dynamic-table %t9.2 2>&1 | FileCheck %s -DFILE=%t9.2 --check-prefix=PAST-THE-EOF
# RUN: llvm-readelf --dynamic-table %t9.2 2>&1 | FileCheck %s -DFILE=%t9.2 --check-prefix=PAST-THE-EOF

# PAST-THE-EOF:      warning: '[[FILE]]': the dynamic string table at 0xb0 goes past the end of the file (0x2c0) with DT_STRSZ = 0x211
# PAST-THE-EOF:      warning: '[[FILE]]': string table was not found
# PAST-THE-EOF:      {{[(]?}}NEEDED{{[)]?}}    Shared library: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}FILTER{{[)]?}}    Filter library: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}AUXILIARY{{[)]?}} Auxiliary library: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}USED{{[)]?}}      Not needed object: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}SONAME{{[)]?}}    Library soname: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}RPATH{{[)]?}}     Library rpath: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}RUNPATH{{[)]?}}   Library runpath: [<?>]
# PAST-THE-EOF-NEXT: {{[(]?}}NULL{{[)]?}}      0x0

## Check that we report a warning when we try to map an address, but loadable
## segments appear unsorted by the p_vaddr member. In this case we are still
## able to map an address.

# RUN: yaml2obj %s --docnum=7 -o %t10
# RUN: llvm-readobj --dynamic-table %t10 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t10 --implicit-check-not=warning: --check-prefixes=OUT-OF-ORDER,OUT-OF-ORDER-LLVM
# RUN: llvm-readelf --dynamic-table %t10 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t10 --implicit-check-not=warning: --check-prefixes=OUT-OF-ORDER,OUT-OF-ORDER-GNU

# OUT-OF-ORDER:           warning: '[[FILE]]': loadable segments are unsorted by virtual address

# OUT-OF-ORDER-LLVM:      DynamicSection [ (2 entries)
# OUT-OF-ORDER-LLVM-NEXT:   Tag                Type   Name/Value
# OUT-OF-ORDER-LLVM-NEXT:   0x0000000000000005 STRTAB 0x1000
# OUT-OF-ORDER-LLVM-NEXT:   0x0000000000000000 NULL   0x0
# OUT-OF-ORDER-LLVM-NEXT: ]

# OUT-OF-ORDER-GNU:       Dynamic section at offset 0xe9 contains 2 entries:
# OUT-OF-ORDER-GNU-NEXT:   Tag                Type     Name/Value
# OUT-OF-ORDER-GNU-NEXT:   0x0000000000000005 (STRTAB) 0x1000
# OUT-OF-ORDER-GNU-NEXT:   0x0000000000000000 (NULL)   0x0

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_EXEC
Sections:
  - Name:    .dynstr
    Type:    SHT_STRTAB
    Address: 0x1000
  - Name:    .dynamic
    Type:    SHT_DYNAMIC
    Address: 0x1010
    Entries:
      - Tag:   DT_STRTAB
        Value: 0x1000
      - Tag:   DT_NULL
        Value: 0
Symbols: []
ProgramHeaders:
  - Type:     PT_LOAD
    VAddr:    0x1010
    FirstSec: .dynamic
    LastSec:  .dynamic
  - Type:     PT_LOAD
    VAddr:    0x1000
    FirstSec: .dynstr
    LastSec:  .dynstr
  - Type:     PT_DYNAMIC
    VAddr:    0x1010
    FirstSec: .dynamic
    LastSec:  .dynamic