llvm/llvm/test/tools/llvm-readobj/ELF/section-details.test

## Check how llvm-readelf prints section details with --section-details.

## Check the output for the 64-bit case.
# RUN: yaml2obj %s -DBITS=64 -DCHDR=0000000008000000000000000400000000000000 -o %t64.o
# RUN: llvm-readelf %t64.o --section-details 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t64.o --strict-whitespace --match-full-lines --check-prefix=GNU64

#       GNU64:There are 22 section headers, starting at offset 0x198:
# GNU64-EMPTY:
#  GNU64-NEXT:Section Headers:
#  GNU64-NEXT:  [Nr] Name
#  GNU64-NEXT:       Type            Address          Off    Size   ES   Lk Inf Al
#  GNU64-NEXT:       Flags
#  GNU64-NEXT:  [ 0] {{$}}
#  GNU64-NEXT:       NULL            0000000000000000 000000 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000000]: {{$}}
#  GNU64-NEXT:  [ 1] allflags_and_long_fields
#  GNU64-NEXT:       PROGBITS        1111111111111111 2222222222222222 4444444444444444 5555555555555555 858993459 1717986918 8608480567731124087
#  GNU64-NEXT:       [ffffffffffffffff]: WRITE, ALLOC, EXEC, MERGE, STRINGS, INFO LINK, LINK ORDER, OS NONCONF, GROUP, TLS, COMPRESSED, EXCLUDE, OS (000000000ff00000), PROC (0000000070000000), UNKNOWN (ffffffff000ff008)
#  GNU64-NEXT:{{.*}}: warning: '[[FILE]]': SHF_COMPRESSED section 'allflags_and_long_fields' does not have an Elf_Chdr header
#  GNU64-NEXT:       [<corrupt>]
#  GNU64-NEXT:  [ 2] noflags
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000000]: {{$}}
#  GNU64-NEXT:  [ 3] write
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000001]: WRITE
#  GNU64-NEXT:  [ 4] alloc
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000002]: ALLOC
#  GNU64-NEXT:  [ 5] exec
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000004]: EXEC
#  GNU64-NEXT:  [ 6] merge
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000010]: MERGE
#  GNU64-NEXT:  [ 7] strings
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000020]: STRINGS
#  GNU64-NEXT:  [ 8] infolink
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000040]: INFO LINK
#  GNU64-NEXT:  [ 9] linkorder
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000080]: LINK ORDER
#  GNU64-NEXT:  [10] nonconforming
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000100]: OS NONCONF
#  GNU64-NEXT:  [11] group
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000200]: GROUP
#  GNU64-NEXT:  [12] tls
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000400]: TLS
#  GNU64-NEXT:  [13] exclude
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000080000000]: EXCLUDE
#  GNU64-NEXT:  [14] known_and_unknown
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [00000000000f0003]: WRITE, ALLOC, UNKNOWN (00000000000f0000)
#  GNU64-NEXT:  [15] only_unknown
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [00000000000f0000]: UNKNOWN (00000000000f0000)
#  GNU64-NEXT:  [16] compressed_corrupted
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000000 00   0   0  0
#  GNU64-NEXT:       [0000000000000800]: COMPRESSED
#  GNU64-NEXT:{{.*}}: warning: '[[FILE]]': SHF_COMPRESSED section 'compressed_corrupted' does not have an Elf_Chdr header
#  GNU64-NEXT:       [<corrupt>]
#  GNU64-NEXT:  [17] compressed_zlib
#  GNU64-NEXT:       PROGBITS        0000000000000000 000040 000023 00   0   0  0
#  GNU64-NEXT:       [0000000000000800]: COMPRESSED
#  GNU64-NEXT:       ZLIB, 0000000000000008, 4
#  GNU64-NEXT:  [18] compressed_zstd
#  GNU64-NEXT:       PROGBITS        0000000000000000 000063 000029 00   0   0  0
#  GNU64-NEXT:       [0000000000000800]: COMPRESSED
#  GNU64-NEXT:       ZSTD, 0000000000000008, 4
#  GNU64-NEXT:  [19] compressed_unknown
#  GNU64-NEXT:       PROGBITS        0000000000000000 00008c 000018 00   0   0  0
#  GNU64-NEXT:       [0000000000000800]: COMPRESSED
#  GNU64-NEXT:       [<unknown>: 0x3], 0000000000000008, 4
#  GNU64-NEXT:  [20] .strtab
#  GNU64-NEXT:       STRTAB          0000000000000000 0000a4 000001 00   0   0  1
#  GNU64-NEXT:       [0000000000000000]: {{$}}
#  GNU64-NEXT:  [21] .shstrtab
#  GNU64-NEXT:       STRTAB          0000000000000000 0000a5 0000ed 00   0   0  1
#  GNU64-NEXT:       [0000000000000000]: {{$}}
#  GNU64-NOT:{{.}}

--- !ELF
FileHeader:
  Class: ELFCLASS[[BITS]]
  Data:  ELFDATA2LSB
  Type:  ET_REL
  Flags: []
Sections:
  - Name:        allflags_and_long_fields
    Type:        SHT_PROGBITS
    ShFlags:     0xffffffffffffffff
    Address:     0x1111111111111111
    ShOffset:    0x2222222222222222
    Link:        0x33333333
    ShSize:      0x4444444444444444
    EntSize:     0x5555555555555555
    Info:        0x66666666
    ShAddrAlign: 0x7777777777777777
  - Name:  noflags
    Type:  SHT_PROGBITS
    Flags: [ ]
  - Name:  write
    Type:  SHT_PROGBITS
    Flags: [ SHF_WRITE ]
  - Name:  alloc
    Type:  SHT_PROGBITS
    Flags: [ SHF_ALLOC ]
  - Name:  exec
    Type:  SHT_PROGBITS
    Flags: [ SHF_EXECINSTR ]
  - Name:  merge
    Type:  SHT_PROGBITS
    Flags: [ SHF_MERGE ]
  - Name:  strings
    Type:  SHT_PROGBITS
    Flags: [ SHF_STRINGS ]
  - Name:  infolink
    Type:  SHT_PROGBITS
    Flags: [ SHF_INFO_LINK ]
  - Name:  linkorder
    Type:  SHT_PROGBITS
    Flags: [ SHF_LINK_ORDER ]
  - Name:  nonconforming
    Type:  SHT_PROGBITS
    Flags: [ SHF_OS_NONCONFORMING ]
  - Name:  group
    Type:  SHT_PROGBITS
    Flags: [ SHF_GROUP ]
  - Name:  tls
    Type:  SHT_PROGBITS
    Flags: [ SHF_TLS ]
  - Name:  exclude
    Type:  SHT_PROGBITS
    Flags: [ SHF_EXCLUDE ]
  - Name:  known_and_unknown
    Type:  SHT_PROGBITS
    ShFlags: 0x000f0003
  - Name:  only_unknown
    Type:  SHT_PROGBITS
    ShFlags: 0x000f0000
  - Name:  compressed_corrupted
    Type:  SHT_PROGBITS
    Flags: [ SHF_COMPRESSED ]
  - Name:  compressed_zlib
    Type:  SHT_PROGBITS
    Flags: [ SHF_COMPRESSED ]
    Content: 01000000[[CHDR]]789c636080000000080001
  - Name:  compressed_zstd
    Type:  SHT_PROGBITS
    Flags: [ SHF_COMPRESSED ]
    Content: 02000000[[CHDR]]28b52ffd20084100000000000000000000
  - Name:  compressed_unknown
    Type:  SHT_PROGBITS
    Flags: [ SHF_COMPRESSED ]
    Content: 03000000[[CHDR]]

## Check the output for the 32-bit case.
# RUN: yaml2obj %s -DBITS=32 -DCHDR=0400000002000000 -o %t32.o
# RUN: llvm-readelf %t32.o --section-details 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t32.o --strict-whitespace --match-full-lines --check-prefix=GNU32

#       GNU32:There are 22 section headers, starting at offset 0x164:
# GNU32-EMPTY:
#  GNU32-NEXT:Section Headers:
#  GNU32-NEXT:  [Nr] Name
#  GNU32-NEXT:       Type            Addr     Off    Size   ES   Lk Inf Al
#  GNU32-NEXT:       Flags
#  GNU32-NEXT:  [ 0] {{$}}
#  GNU32-NEXT:       NULL            00000000 000000 000000 00   0   0  0
#  GNU32-NEXT:       [00000000]: {{$}}
#  GNU32-NEXT:  [ 1] allflags_and_long_fields
#  GNU32-NEXT:       PROGBITS        11111111 22222222 44444444 55555555 858993459 1717986918 2004318071
#  GNU32-NEXT:       [ffffffff]: WRITE, ALLOC, EXEC, MERGE, STRINGS, INFO LINK, LINK ORDER, OS NONCONF, GROUP, TLS, COMPRESSED, EXCLUDE, OS (0ff00000), PROC (70000000), UNKNOWN (000ff008)
#  GNU32-NEXT:{{.*}}: warning: '[[FILE]]': SHF_COMPRESSED section 'allflags_and_long_fields' does not have an Elf_Chdr header
#  GNU32-NEXT:       [<corrupt>]
#  GNU32-NEXT:  [ 2] noflags
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000000]: {{$}}
#  GNU32-NEXT:  [ 3] write
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000001]: WRITE
#  GNU32-NEXT:  [ 4] alloc
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000002]: ALLOC
#  GNU32-NEXT:  [ 5] exec
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000004]: EXEC
#  GNU32-NEXT:  [ 6] merge
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000010]: MERGE
#  GNU32-NEXT:  [ 7] strings
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000020]: STRINGS
#  GNU32-NEXT:  [ 8] infolink
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000040]: INFO LINK
#  GNU32-NEXT:  [ 9] linkorder
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000080]: LINK ORDER
#  GNU32-NEXT:  [10] nonconforming
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000100]: OS NONCONF
#  GNU32-NEXT:  [11] group
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000200]: GROUP
#  GNU32-NEXT:  [12] tls
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000400]: TLS
#  GNU32-NEXT:  [13] exclude
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [80000000]: EXCLUDE
#  GNU32-NEXT:  [14] known_and_unknown
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [000f0003]: WRITE, ALLOC, UNKNOWN (000f0000)
#  GNU32-NEXT:  [15] only_unknown
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [000f0000]: UNKNOWN (000f0000)
#  GNU32-NEXT:  [16] compressed_corrupted
#  GNU32-NEXT:       PROGBITS        00000000 000034 000000 00   0   0  0
#  GNU32-NEXT:       [00000800]: COMPRESSED
#  GNU32-NEXT:{{.*}}: warning: '[[FILE]]': SHF_COMPRESSED section 'compressed_corrupted' does not have an Elf_Chdr header
#  GNU32-NEXT:       [<corrupt>]
#  GNU32-NEXT:  [17] compressed_zlib
#  GNU32-NEXT:       PROGBITS        00000000 000034 000017 00   0   0  0
#  GNU32-NEXT:       [00000800]: COMPRESSED
#  GNU32-NEXT:       ZLIB, 00000004, 2
#  GNU32-NEXT:  [18] compressed_zstd
#  GNU32-NEXT:       PROGBITS        00000000 00004b 00001d 00   0   0  0
#  GNU32-NEXT:       [00000800]: COMPRESSED
#  GNU32-NEXT:       ZSTD, 00000004, 2
#  GNU32-NEXT:  [19] compressed_unknown
#  GNU32-NEXT:       PROGBITS        00000000 000068 00000c 00   0   0  0
#  GNU32-NEXT:       [00000800]: COMPRESSED
#  GNU32-NEXT:       [<unknown>: 0x3], 00000004, 2
#  GNU32-NEXT:  [20] .strtab
#  GNU32-NEXT:       STRTAB          00000000 000074 000001 00   0   0  1
#  GNU32-NEXT:       [00000000]: {{$}}
#  GNU32-NEXT:  [21] .shstrtab
#  GNU32-NEXT:       STRTAB          00000000 000075 0000ed 00   0   0  1
#  GNU32-NEXT:       [00000000]: {{$}}
#  GNU32-NOT:{{.}}

## When --section-details and --sections are both specified, --sections is ignored.
# RUN: llvm-readelf %t64.o --section-details --sections 2>&1 | FileCheck %s -DFILE=%t64.o --check-prefix=GNU64
# RUN: llvm-readelf %t64.o --sections --section-details 2>&1 | FileCheck %s -DFILE=%t64.o --check-prefix=GNU64

## Check that we produce the same output with -t (alias).
# RUN: llvm-readelf --section-details %t64.o > %t.readelf.full
# RUN: llvm-readelf -t %t64.o > %t.readelf.alias
# RUN: cmp %t.readelf.full %t.readelf.alias

## Check how we dump sections when the section header string table can't be read.

# RUN: yaml2obj --docnum=2 %s -o %tshstrndx.o
# RUN: llvm-readelf %tshstrndx.o --section-details 2>&1 | \
# RUN:   FileCheck %s -DFILE=%tshstrndx.o --check-prefix=SHSTRNDX

# SHSTRNDX:      Section Headers:
# SHSTRNDX-NEXT:   [Nr] Name
# SHSTRNDX-NEXT:        Type            Address          Off    Size   ES   Lk Inf Al
# SHSTRNDX-NEXT:        Flags
# SHSTRNDX-NEXT: warning: '[[FILE]]': section header string table index 65279 does not exist
# SHSTRNDX-NEXT:   [ 0]
# SHSTRNDX-NEXT:        NULL            0000000000000000 000000 000000 00   0   0  0
# SHSTRNDX-NEXT:        [0000000000000000]:
# SHSTRNDX-NEXT: warning: '[[FILE]]': a section [index 1] has an invalid sh_name (0x5) offset which goes past the end of the section name string table
# SHSTRNDX-NEXT:   [ 1] <?>
# SHSTRNDX-NEXT:        PROGBITS        0000000000000000 000040 000000 00   0   0  0
# SHSTRNDX-NEXT:        [0000000000000000]:
# SHSTRNDX-NEXT: warning: '[[FILE]]': a section [index 2] has an invalid sh_name (0x1) offset which goes past the end of the section name string table
# SHSTRNDX-NEXT:   [ 2] <?>
# SHSTRNDX-NEXT:        PROGBITS        0000000000000000 000040 000000 00   0   0  0
# SHSTRNDX-NEXT:        [0000000000000000]:
# SHSTRNDX-NEXT: warning: '[[FILE]]': a section [index 3] has an invalid sh_name (0x13) offset which goes past the end of the section name string table
# SHSTRNDX-NEXT:   [ 3] <?>
# SHSTRNDX-NEXT:        STRTAB          0000000000000000 000040 000001 00   0   0  1
# SHSTRNDX-NEXT:        [0000000000000000]:
# SHSTRNDX-NEXT: warning: '[[FILE]]': a section [index 4] has an invalid sh_name (0x9) offset which goes past the end of the section name string table
# SHSTRNDX-NEXT:   [ 4] <?>
# SHSTRNDX-NEXT:        STRTAB          0000000000000000 000041 00001b 00   0   0  1
# SHSTRNDX-NEXT:        [0000000000000000]:

--- !ELF
FileHeader:
  Class:     ELFCLASS64
  Data:      ELFDATA2LSB
  Type:      ET_REL
  EShStrNdx: 0xfeff
Sections:
  - Name: foo
    Type: SHT_PROGBITS
  - Name: bar
    Type: SHT_PROGBITS