xref: /llvm-project/llvm/test/tools/llvm-objcopy/ELF/only-keep-debug.test (revision 3787de40de207b6a505e7b110d58ef4497241bff)
15ad0103dSFangrui Song# RUN: yaml2obj --docnum=1 %s -o %t1
25ad0103dSFangrui Song# RUN: llvm-objcopy --only-keep-debug %t1 %t1.dbg
35ad0103dSFangrui Song# RUN: llvm-readelf -S -l -x .note1 -x .note2 -x .debug_abbrev -x .debug_frame -x .debug_info %t1.dbg | FileCheck %s
4*3787de40SJohn McIver## --only-keep-debug suppresses the default --strip-all.
5*3787de40SJohn McIver# RUN: llvm-strip --only-keep-debug %t1
6*3787de40SJohn McIver# RUN: llvm-readelf -S -l -x .note1 -x .note2 -x .debug_abbrev -x .debug_frame -x .debug_info %t1 | FileCheck %s
75ad0103dSFangrui Song
85ad0103dSFangrui Song## Check that SHT_NOTE and .debug* are kept, but others are changed to SHT_NOBITS.
95ad0103dSFangrui Song## SHT_NOBITS sections do not occupy space in the output.
105ad0103dSFangrui Song
115ad0103dSFangrui Song# CHECK:      [Nr] Name          Type     Address          Off    Size   ES Flg Lk Inf Al
125ad0103dSFangrui Song# CHECK:      [ 1] .note1        NOTE     0000000000000400 000400 000001 00   A  0   0 1024
135ad0103dSFangrui Song# CHECK-NEXT: [ 2] .note2        NOTE     0000000000000401 000401 000001 00   A  0   0  0
145ad0103dSFangrui Song# CHECK-NEXT: [ 3] .text         NOBITS   0000000000000402 000402 000001 00  AX  0   0  0
155ad0103dSFangrui Song# CHECK-NEXT: [ 4] .tdata        NOBITS   0000000000001480 000480 000007 00 WAT  0   0 128
165ad0103dSFangrui Song# CHECK-NEXT: [ 5] .tbss         NOBITS   0000000000001487 000480 000005 00 WAT  0   0  0
175ad0103dSFangrui Song# CHECK-NEXT: [ 6] .bss          NOBITS   00000000000014a0 000480 00003f 00  WA  0   0 32
185ad0103dSFangrui Song## objcopy sets sh_offset to 0x402. We don't do this to keep sh_offset non-decreasing.
195ad0103dSFangrui Song# CHECK-NEXT: [ 7] .debug_abbrev PROGBITS 0000000000000000 000480 000001 00      0   0  0
205ad0103dSFangrui Song# CHECK-NEXT: [ 8] .debug_frame  PROGBITS 0000000000000000 000488 000001 00      0   0  8
215ad0103dSFangrui Song# CHECK-NEXT: [ 9] .debug_info   PROGBITS 0000000000000000 000489 000001 00      0   0  0
225ad0103dSFangrui Song# CHECK-NEXT: [10] .strtab       STRTAB   0000000000000000 00048a 000001 00      0   0  1
235ad0103dSFangrui Song# CHECK-NEXT: [11] .shstrtab     STRTAB   0000000000000000 00048b 000060 00      0   0  1
245ad0103dSFangrui Song
255ad0103dSFangrui Song# CHECK:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
265ad0103dSFangrui Song# CHECK-NEXT: LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x000402 0x000403 R E 0x1000
27b236b4cbSGeorgii Rymar# CHECK-NEXT: LOAD 0x000480 0x0000000000001480 0x0000000000001480 0x000000 0x00005f RW  0x1000
28b236b4cbSGeorgii Rymar# CHECK-NEXT: TLS  0x000480 0x0000000000001480 0x0000000000001480 0x000000 0x00000c RW  0x80
29b236b4cbSGeorgii Rymar# CHECK-NEXT: NOTE 0x000400 0x0000000000000400 0x0000000000000400 0x000002 0x000002     0x400
305ad0103dSFangrui Song
315ad0103dSFangrui Song## Contents of SHT_NOTE and .debug* are kept.
325ad0103dSFangrui Song
335ad0103dSFangrui Song# CHECK:      Hex dump of section '.note1':
345ad0103dSFangrui Song# CHECK-NEXT: 0x00000400 01
355ad0103dSFangrui Song# CHECK:      Hex dump of section '.note2':
365ad0103dSFangrui Song# CHECK-NEXT: 0x00000401 02
375ad0103dSFangrui Song# CHECK:      Hex dump of section '.debug_abbrev':
385ad0103dSFangrui Song# CHECK-NEXT: 0x00000000 03
395ad0103dSFangrui Song# CHECK:      Hex dump of section '.debug_frame':
405ad0103dSFangrui Song# CHECK-NEXT: 0x00000000 04
415ad0103dSFangrui Song# CHECK:      Hex dump of section '.debug_info':
425ad0103dSFangrui Song# CHECK-NEXT: 0x00000000 05
435ad0103dSFangrui Song
445ad0103dSFangrui Song--- !ELF
455ad0103dSFangrui SongFileHeader:
465ad0103dSFangrui Song  Class:     ELFCLASS64
475ad0103dSFangrui Song  Data:      ELFDATA2LSB
485ad0103dSFangrui Song  Type:      ET_DYN
495ad0103dSFangrui Song  Machine:   EM_X86_64
505ad0103dSFangrui SongSections:
515ad0103dSFangrui Song  - Name:         .note1
525ad0103dSFangrui Song    Type:         SHT_NOTE
535ad0103dSFangrui Song    Flags:        [ SHF_ALLOC ]
545ad0103dSFangrui Song    Address:      0x400
555ad0103dSFangrui Song    AddressAlign: 0x400
565ad0103dSFangrui Song    Content:      01
575ad0103dSFangrui Song  - Name:         .note2
585ad0103dSFangrui Song    Type:         SHT_NOTE
595ad0103dSFangrui Song    Flags:        [ SHF_ALLOC ]
605ad0103dSFangrui Song    Address:      0x401
615ad0103dSFangrui Song    Content:      02
625ad0103dSFangrui Song  - Name:         .text
635ad0103dSFangrui Song    Type:         SHT_PROGBITS
645ad0103dSFangrui Song    Flags:        [ SHF_ALLOC, SHF_EXECINSTR ]
655ad0103dSFangrui Song    Address:      0x402
665ad0103dSFangrui Song    Content:      c3
675ad0103dSFangrui Song  - Name:         .tdata
685ad0103dSFangrui Song    Type:         SHT_PROGBITS
695ad0103dSFangrui Song    Flags:        [ SHF_ALLOC, SHF_WRITE, SHF_TLS ]
705ad0103dSFangrui Song    Address:      0x1480          # Ensure Address=0x1000+Offset
715ad0103dSFangrui Song    AddressAlign: 0x80
725ad0103dSFangrui Song    # An arbitrary non-zero Size tests that .tdata does not occupy space
735ad0103dSFangrui Song    # and we can rewrite p_filesz of PT_TLS.
745ad0103dSFangrui Song    Size:         7
755ad0103dSFangrui Song  - Name:         .tbss
765ad0103dSFangrui Song    Type:         SHT_NOBITS
775ad0103dSFangrui Song    Flags:        [ SHF_ALLOC, SHF_WRITE, SHF_TLS ]
785ad0103dSFangrui Song    Address:      0x1487          # Ensure Address=0x1000+Offset
795ad0103dSFangrui Song    Size:         5
805ad0103dSFangrui Song  - Name:         .bss
815ad0103dSFangrui Song    Type:         SHT_NOBITS
825ad0103dSFangrui Song    Flags:        [ SHF_ALLOC, SHF_WRITE ]
835ad0103dSFangrui Song    Address:      0x14a0          # Ensure Address=0x1000+Offset
845ad0103dSFangrui Song    AddressAlign: 0x20
855ad0103dSFangrui Song    # An arbitrary non-zero Size tests that .bss does not occupy space.
865ad0103dSFangrui Song    Size:         63
875ad0103dSFangrui Song  - Name:         .debug_abbrev
885ad0103dSFangrui Song    Type:         SHT_PROGBITS
895ad0103dSFangrui Song    Content:      03
905ad0103dSFangrui Song  - Name:         .debug_frame
915ad0103dSFangrui Song    Type:         SHT_PROGBITS
925ad0103dSFangrui Song    # AddressAlign tests the file offset assignment leaves a gap.
935ad0103dSFangrui Song    AddressAlign: 0x8
945ad0103dSFangrui Song    Content:      04
955ad0103dSFangrui Song  - Name:         .debug_info
965ad0103dSFangrui Song    Type:         SHT_PROGBITS
975ad0103dSFangrui Song    Content:      05
985ad0103dSFangrui SongProgramHeaders:
995ad0103dSFangrui Song  - Type:     PT_LOAD
1005ad0103dSFangrui Song    Flags:    [ PF_R, PF_X ]
1015ad0103dSFangrui Song    Offset:   0
1025ad0103dSFangrui Song    Align:    0x1000
103a7a447beSGeorgii Rymar    FirstSec: .note1
104a7a447beSGeorgii Rymar    LastSec:  .text
1055ad0103dSFangrui Song  - Type:     PT_LOAD
1065ad0103dSFangrui Song    Flags:    [ PF_R, PF_W ]
1075ad0103dSFangrui Song    VAddr:    0x1480    # Ensure Offset=VAddr (mod Align) if Offset changes
1085ad0103dSFangrui Song    Align:    0x1000
109a7a447beSGeorgii Rymar    FirstSec: .tdata
110a7a447beSGeorgii Rymar    LastSec:  .bss
1115ad0103dSFangrui Song  - Type:     PT_TLS
1125ad0103dSFangrui Song    Flags:    [ PF_R, PF_W ]
1135ad0103dSFangrui Song    VAddr:    0x1480    # Ensure Offset=VAddr (mod Align) if Offset changes
114a7a447beSGeorgii Rymar    FirstSec: .tdata
115a7a447beSGeorgii Rymar    LastSec:  .tbss
1165ad0103dSFangrui Song  - Type:     PT_NOTE
1175ad0103dSFangrui Song    VAddr:    0x400
118a7a447beSGeorgii Rymar    FirstSec: .note1
119a7a447beSGeorgii Rymar    LastSec:  .note2
1205ad0103dSFangrui Song...
1215ad0103dSFangrui Song
1225ad0103dSFangrui Song# RUN: yaml2obj --docnum=2 %s -o %t2
1235ad0103dSFangrui Song# RUN: llvm-objcopy --only-keep-debug %t2 %t2.dbg
1245ad0103dSFangrui Song# RUN: llvm-readelf -S -l %t2.dbg | FileCheck --check-prefix=CHECK2 %s
1255ad0103dSFangrui Song
1265ad0103dSFangrui Song## Only the tail of a segment can be trimmed. .text still occupies space because
1275ad0103dSFangrui Song## it is followed by .note which is not SHT_NOBITS.
1285ad0103dSFangrui Song# CHECK2:      [Nr] Name        Type     Address          Off    Size   ES Flg Lk Inf Al
1295ad0103dSFangrui Song# CHECK2:      [ 1] .text       NOBITS   0000000000000200 000200 000001 00  AX  0   0 512
1305ad0103dSFangrui Song# CHECK2-NEXT: [ 2] .note       NOTE     0000000000000201 000201 000001 00   A  0   0  0
1315ad0103dSFangrui Song# CHECK2-NEXT: [ 3] .debug_info PROGBITS 0000000000000000 000220 000001 00      0   0 32
1325ad0103dSFangrui Song# CHECK2-NEXT: [ 4] .strtab     STRTAB   0000000000000000 000221 000001 00      0   0  1
1335ad0103dSFangrui Song# CHECK2-NEXT: [ 5] .shstrtab   STRTAB   0000000000000000 000222 00002b 00      0   0  1
1345ad0103dSFangrui Song
135b3336bfaSFangrui Song## Check that p_offset or p_filesz of PT_PHDR are not modified.
1365ad0103dSFangrui Song# CHECK2:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
137b236b4cbSGeorgii Rymar# CHECK2-NEXT: PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x0000a8 0x0000a8 R   0x8
1385ad0103dSFangrui Song# CHECK2-NEXT: LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x000202 0x000202 R E 0x1000
139b3336bfaSFangrui Song# CHECK2-NEXT: LOAD 0x000000 0x0000000000000202 0x0000000000000202 0x000000 0x00000e RW  0x1
1405ad0103dSFangrui Song
1415ad0103dSFangrui Song--- !ELF
1425ad0103dSFangrui SongFileHeader:
1435ad0103dSFangrui Song  Class:   ELFCLASS64
1445ad0103dSFangrui Song  Data:    ELFDATA2LSB
1455ad0103dSFangrui Song  Type:    ET_DYN
1465ad0103dSFangrui Song  Machine: EM_X86_64
1475ad0103dSFangrui SongSections:
1485ad0103dSFangrui Song  - Name:         .text
1495ad0103dSFangrui Song    Type:         SHT_PROGBITS
1505ad0103dSFangrui Song    Flags:        [ SHF_ALLOC, SHF_EXECINSTR ]
1515ad0103dSFangrui Song    Address:      0x200
1525ad0103dSFangrui Song    AddressAlign: 0x200
1535ad0103dSFangrui Song    Content:      c3
1545ad0103dSFangrui Song  - Name:         .note
1555ad0103dSFangrui Song    Type:         SHT_NOTE
1565ad0103dSFangrui Song    Flags:        [ SHF_ALLOC ]
1575ad0103dSFangrui Song    Address:      0x201
1585ad0103dSFangrui Song    Content:      01
1595ad0103dSFangrui Song  - Name:         .debug_info
1605ad0103dSFangrui Song    Type:         SHT_PROGBITS
1615ad0103dSFangrui Song    AddressAlign: 0x20
1625ad0103dSFangrui Song    Content:      02
1635ad0103dSFangrui SongProgramHeaders:
1645ad0103dSFangrui Song  - Type:     PT_PHDR
1655ad0103dSFangrui Song    Flags:    [ PF_R ]
1665ad0103dSFangrui Song    Offset:   0x40
1675ad0103dSFangrui Song    VAddr:    0x40
1685ad0103dSFangrui Song    # 3 * sizeof(Elf64_Phdr) = 0xa8
1695ad0103dSFangrui Song    FileSize: 0xa8
1705ad0103dSFangrui Song    MemSize:  0xa8
1715ad0103dSFangrui Song    Align:    8
1725ad0103dSFangrui Song  - Type:     PT_LOAD
1735ad0103dSFangrui Song    Flags:    [ PF_R, PF_X ]
1745ad0103dSFangrui Song    Offset:   0
1755ad0103dSFangrui Song    Align:    4096
176a7a447beSGeorgii Rymar    FirstSec: .text
177a7a447beSGeorgii Rymar    LastSec:  .note
1785ad0103dSFangrui Song  - Type:     PT_LOAD
1795ad0103dSFangrui Song    Flags:    [ PF_R, PF_W ]
1805ad0103dSFangrui Song    Offset:   0x202
1815ad0103dSFangrui Song    VAddr:    0x202
1825ad0103dSFangrui Song    FileSize: 14
1835ad0103dSFangrui Song    MemSize:  14
1845ad0103dSFangrui Song...
1855ad0103dSFangrui Song
1865ad0103dSFangrui Song## If .symtab or .strtab has the SHF_ALLOC flag, it will be changed to SHT_NOBITS.
1875ad0103dSFangrui Song# RUN: yaml2obj --docnum=3 %s -o %t3
1885ad0103dSFangrui Song# RUN: llvm-objcopy --only-keep-debug %t3 %t3.dbg
1895ad0103dSFangrui Song# RUN: llvm-readelf -S -l %t3.dbg | FileCheck --check-prefix=CHECK3 %s
1905ad0103dSFangrui Song
1915ad0103dSFangrui Song# CHECK3:      [Nr] Name          Type     Address          Off    Size   ES Flg Lk Inf Al
1925ad0103dSFangrui Song# CHECK3:      [ 1] .dynsym       NOBITS   0000000000000000 000040 000018 18   A  2   1 1024
19331f2ad9cSGeorgii Rymar# CHECK3-NEXT: [ 2] .dynstr       NOBITS   0000000000000018 000040 000001 00   A  0   0  0
194d5e48f13SGeorgii Rymar# CHECK3-NEXT: [ 3] .symtab       NOBITS   0000000000000019 000040 000018 00   A  4   1  0
19531f2ad9cSGeorgii Rymar# CHECK3-NEXT: [ 4] .strtab       NOBITS   0000000000000031 000040 000001 00   A  0   0  0
1965ad0103dSFangrui Song# CHECK3-NEXT: [ 5] .shstrtab     STRTAB   0000000000000000 000040 00002b 00      0   0  1
1975ad0103dSFangrui Song
1985ad0103dSFangrui Song--- !ELF
1995ad0103dSFangrui SongFileHeader:
2005ad0103dSFangrui Song  Class:   ELFCLASS64
2015ad0103dSFangrui Song  Data:    ELFDATA2LSB
2025ad0103dSFangrui Song  Type:    ET_DYN
2035ad0103dSFangrui Song  Machine: EM_X86_64
2045ad0103dSFangrui SongSections:
2055ad0103dSFangrui Song  - Name:  .dynsym
2065ad0103dSFangrui Song    Type:  SHT_DYNSYM
2075ad0103dSFangrui Song    Flags: [ SHF_ALLOC ]
2085ad0103dSFangrui Song    Link:  .dynstr
2095ad0103dSFangrui Song    AddressAlign: 0x400
2105ad0103dSFangrui Song  - Name:  .dynstr
2115ad0103dSFangrui Song    Type:  SHT_STRTAB
2125ad0103dSFangrui Song    Flags: [ SHF_ALLOC ]
2135ad0103dSFangrui Song  - Name:  .symtab
214d5e48f13SGeorgii Rymar## TODO: this should be SHT_SYMTAB, but currently llvm-objcopy reports an error:
215d5e48f13SGeorgii Rymar##       error: Symbol table has link index of 4 which is not a string table
2165ad0103dSFangrui Song    Type:  SHT_STRTAB
2175ad0103dSFangrui Song    Flags: [ SHF_ALLOC ]
2185ad0103dSFangrui Song    Link:  .strtab
2195ad0103dSFangrui Song  - Name:  .strtab
2205ad0103dSFangrui Song    Type:  SHT_STRTAB
2215ad0103dSFangrui Song    Flags: [ SHF_ALLOC ]
2225ad0103dSFangrui SongDynamicSymbols: []
2235ad0103dSFangrui SongSymbols: []
22420de1822SFangrui Song
22520de1822SFangrui Song## PT_TLS and .tdata are empty. Test that we set its p_offset to the parent
22620de1822SFangrui Song## segment's p_offset. If we don't rewrite the p_offset of PT_TLS and the deleted
22720de1822SFangrui Song## bytes are large, p_offset can be larger than the file size, and trigger
22820de1822SFangrui Song## validation errors with subsequent tools.
22920de1822SFangrui Song# RUN: yaml2obj --docnum=4 %s -o %t4
23020de1822SFangrui Song# RUN: llvm-objcopy --only-keep-debug %t4 %t4.dbg
23120de1822SFangrui Song# RUN: llvm-readelf -S -l %t4.dbg | FileCheck --check-prefix=CHECK4 %s
23220de1822SFangrui Song
23320de1822SFangrui Song# CHECK4:      [Nr] Name        Type     Address          Off    Size   ES Flg Lk Inf Al
23420de1822SFangrui Song# CHECK4:      [ 1] .text       NOBITS   0000000000000200 000200 000001 00  AX  0   0  0
23520de1822SFangrui Song# CHECK4-NEXT: [ 2] .tdata      NOBITS   0000000000001240 000240 000000 00 WAT  0   0 64
23620de1822SFangrui Song# CHECK4-NEXT: [ 3] .got        NOBITS   0000000000001240 000240 000008 00  WA  0   0  0
23720de1822SFangrui Song
23820de1822SFangrui Song# CHECK4:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
23920de1822SFangrui Song# CHECK4-NEXT: LOAD 0x000200 0x0000000000000200 0x0000000000000200 0x000000 0x000001 R E 0x1000
24020de1822SFangrui Song# CHECK4-NEXT: LOAD 0x000240 0x0000000000001240 0x0000000000001240 0x000000 0x000008 RW  0x1000
24120de1822SFangrui Song# CHECK4-NEXT: TLS  0x000240 0x0000000000001240 0x0000000000001240 0x000000 0x000000 R   0x40
24220de1822SFangrui Song
24320de1822SFangrui Song--- !ELF
24420de1822SFangrui SongFileHeader:
24520de1822SFangrui Song  Class:   ELFCLASS64
24620de1822SFangrui Song  Data:    ELFDATA2LSB
24720de1822SFangrui Song  Type:    ET_DYN
24820de1822SFangrui Song  Machine: EM_X86_64
24920de1822SFangrui SongSections:
25020de1822SFangrui Song  - Name:         .text
25120de1822SFangrui Song    Type:         SHT_PROGBITS
25220de1822SFangrui Song    Flags:        [ SHF_ALLOC, SHF_EXECINSTR ]
25320de1822SFangrui Song    Address:      0x200
25420de1822SFangrui Song    Size:         1
25520de1822SFangrui Song  - Name:         .tdata
25620de1822SFangrui Song    Type:         SHT_PROGBITS
25720de1822SFangrui Song    Flags:        [ SHF_ALLOC, SHF_WRITE, SHF_TLS ]
25820de1822SFangrui Song    Address:      0x1240   # Ensure Address=0x1000+Offset
25920de1822SFangrui Song    AddressAlign: 0x40
26020de1822SFangrui Song  - Name:         .got
26120de1822SFangrui Song    Type:         SHT_PROGBITS
26220de1822SFangrui Song    Flags:        [ SHF_ALLOC, SHF_WRITE ]
26320de1822SFangrui Song    Size:         8
26420de1822SFangrui SongProgramHeaders:
26520de1822SFangrui Song  - Type:     PT_LOAD
26620de1822SFangrui Song    Flags:    [ PF_R, PF_X ]
26720de1822SFangrui Song    VAddr:    0x200
26820de1822SFangrui Song    Align:    0x1000
26920de1822SFangrui Song    FirstSec: .text
27020de1822SFangrui Song    LastSec:  .text
27120de1822SFangrui Song  ## Add .got so that the PT_LOAD does not have zero p_memsz. We don't add
27220de1822SFangrui Song  ## sections to zero-sized segments so zero-sized segments may have strange
27320de1822SFangrui Song  ## offsets. In practice, the Linux kernel errors when mmapping a p_memsz
27420de1822SFangrui Song  ## PT_LOAD,so for practical so this assumption can generally be made.
27520de1822SFangrui Song  - Type:     PT_LOAD
27620de1822SFangrui Song    Flags:    [ PF_R, PF_W ]
27720de1822SFangrui Song    VAddr:    0x1240
27820de1822SFangrui Song    Align:    0x1000
27920de1822SFangrui Song    FirstSec: .tdata
28020de1822SFangrui Song    LastSec:  .got
28120de1822SFangrui Song  - Type:     PT_TLS
28220de1822SFangrui Song    Flags:    [ PF_R ]
28320de1822SFangrui Song    VAddr:    0x1240
28420de1822SFangrui Song    FirstSec: .tdata
28520de1822SFangrui Song    LastSec:  .tdata
286b3336bfaSFangrui Song
287b3336bfaSFangrui Song## The offset and size fields of segments which contain no section and have no
288b3336bfaSFangrui Song## parent segment are set to zeros, so that we can decrease the file size. Such
289b3336bfaSFangrui Song## segments are not useful for debugging.
290b3336bfaSFangrui Song# RUN: yaml2obj --docnum=5 %s -o %t5
291b3336bfaSFangrui Song# RUN: llvm-objcopy --only-keep-debug %t5 %t5.dbg
292b3336bfaSFangrui Song# RUN: llvm-readelf -S -l %t5.dbg | FileCheck --check-prefix=CHECK5 %s
293b3336bfaSFangrui Song# RUN: llvm-objcopy --strip-sections %t5 %t5s
294b3336bfaSFangrui Song# RUN: llvm-objcopy --only-keep-debug %t5s %t5s.dbg
295b3336bfaSFangrui Song# RUN: llvm-readelf -S -l %t5s.dbg | FileCheck --check-prefix=CHECK5S %s
296b3336bfaSFangrui Song
297b3336bfaSFangrui Song# CHECK5:      [Nr] Name        Type     Address          Off    Size   ES Flg Lk Inf Al
298b3336bfaSFangrui Song# CHECK5:      [ 1] .foo        NOBITS   0000000000000000 000078 001000 00   A  0   0  0
299b3336bfaSFangrui Song# CHECK5-NEXT: [ 2] .strtab     STRTAB   0000000000000000 000078 000001 00      0   0  1
300b3336bfaSFangrui Song# CHECK5-NEXT: [ 3] .shstrtab   STRTAB   0000000000000000 000079 000018 00      0   0  1
301b3336bfaSFangrui Song
302b3336bfaSFangrui Song# CHECK5:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
303b3336bfaSFangrui Song# CHECK5-NEXT: NULL 0x000000 0x0000000000000000 0x0000000000000000 0x000078 0x001000     0x1
304b3336bfaSFangrui Song# CHECK5-EMPTY:
305b3336bfaSFangrui Song
306b3336bfaSFangrui Song# CHECK5S:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
307b3336bfaSFangrui Song# CHECK5S-NEXT: NULL 0x000000 0x0000000000000000 0x0000000000000000 0x000078 0x001000     0x1
308b3336bfaSFangrui Song# CHECK5S-EMPTY:
309b3336bfaSFangrui Song--- !ELF
310b3336bfaSFangrui SongFileHeader:
311b3336bfaSFangrui Song  Class:   ELFCLASS64
312b3336bfaSFangrui Song  Data:    ELFDATA2LSB
313b3336bfaSFangrui Song  Type:    ET_DYN
314b3336bfaSFangrui SongSections:
315b3336bfaSFangrui Song  - Name:    .foo
316b3336bfaSFangrui Song    Type:    SHT_PROGBITS
317b3336bfaSFangrui Song    Flags:   [ SHF_ALLOC ]
318b3336bfaSFangrui Song    Size:    0x01000
319b3336bfaSFangrui SongProgramHeaders:
320b3336bfaSFangrui Song  - Type:     PT_NULL
321b3336bfaSFangrui Song    Flags:    []
322b3336bfaSFangrui Song    FileSize: 0x01000
323b3336bfaSFangrui Song    MemSize:  0x01000
32468616584SIgor Kudrin
32568616584SIgor Kudrin## Check that sections are placed correctly in a case when their order in the
32668616584SIgor Kudrin## section header table is different from their layout.
32768616584SIgor Kudrin# RUN: yaml2obj --docnum=6 %s -o %t6
32868616584SIgor Kudrin# RUN: llvm-objcopy --only-keep-debug %t6 %t6.dbg
32968616584SIgor Kudrin# RUN: llvm-readelf -S -l %t6.dbg | FileCheck --check-prefix=CHECK6 %s
33068616584SIgor Kudrin
33168616584SIgor Kudrin# CHECK6:      [Nr] Name        Type     Address          Off    Size   ES Flg Lk Inf Al
33268616584SIgor Kudrin# CHECK6:      [ 1] foo         NOBITS   0000000000000008 001000 000008 00   A  0   0  4
33368616584SIgor Kudrin# CHECK6-NEXT: [ 2] bar         NOBITS   0000000000000000 001000 000008 00   A  0   0  4
33468616584SIgor Kudrin# CHECK6-NEXT: [ 3] baz         NOTE     0000000000000018 001008 000008 00   A  0   0  0
33568616584SIgor Kudrin# CHECK6-NEXT: [ 4] qux         NOTE     0000000000000010 001000 000008 00   A  0   0  0
33668616584SIgor Kudrin
33768616584SIgor Kudrin# CHECK6:      Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
33868616584SIgor Kudrin# CHECK6-NEXT: LOAD 0x001000 0x0000000000000000 0x0000000000000000 0x000000 0x000010 R   0x1000
33968616584SIgor Kudrin# CHECK6-NEXT: LOAD 0x001000 0x0000000000000010 0x0000000000000010 0x000010 0x000010 R   0x1
34068616584SIgor Kudrin# CHECK6-EMPTY:
34168616584SIgor Kudrin
34268616584SIgor Kudrin--- !ELF
34368616584SIgor KudrinFileHeader:
34468616584SIgor Kudrin  Class:           ELFCLASS64
34568616584SIgor Kudrin  Data:            ELFDATA2LSB
34668616584SIgor Kudrin  Type:            ET_DYN
34768616584SIgor Kudrin  Machine:         EM_X86_64
34868616584SIgor KudrinProgramHeaders:
34968616584SIgor Kudrin  - Type:     PT_LOAD
35068616584SIgor Kudrin    Flags:    [ PF_R ]
35168616584SIgor Kudrin    Offset:   0x1000
35268616584SIgor Kudrin    VAddr:    0x0
35368616584SIgor Kudrin    Align:    0x1000
35468616584SIgor Kudrin    FileSize: 0x10
35568616584SIgor Kudrin    MemSize:  0x10
35668616584SIgor Kudrin  - Type:     PT_LOAD
35768616584SIgor Kudrin    Flags:    [ PF_R ]
35868616584SIgor Kudrin    Offset:   0x1010
35968616584SIgor Kudrin    VAddr:    0x10
36068616584SIgor Kudrin    FileSize: 0x10
36168616584SIgor Kudrin    MemSize:  0x10
36268616584SIgor KudrinSections:
36368616584SIgor Kudrin  - Name:            bar
36468616584SIgor Kudrin    Type:            SHT_PROGBITS
36568616584SIgor Kudrin    Flags:           [ SHF_ALLOC ]
36668616584SIgor Kudrin    Address:         0x0
36768616584SIgor Kudrin    AddressAlign:    0x4
36868616584SIgor Kudrin    Offset:          0x1000
36968616584SIgor Kudrin    Content:         0000000000000000
37068616584SIgor Kudrin  - Name:            foo
37168616584SIgor Kudrin    Type:            SHT_PROGBITS
37268616584SIgor Kudrin    Flags:           [ SHF_ALLOC ]
37368616584SIgor Kudrin    Address:         0x8
37468616584SIgor Kudrin    AddressAlign:    0x4
37568616584SIgor Kudrin    Offset:          0x1008
37668616584SIgor Kudrin    Content:         0000000000000000
37768616584SIgor Kudrin  - Name:            qux
37868616584SIgor Kudrin    Type:            SHT_NOTE
37968616584SIgor Kudrin    Flags:           [ SHF_ALLOC ]
38068616584SIgor Kudrin    Address:         0x10
38168616584SIgor Kudrin    Offset:          0x1010
38268616584SIgor Kudrin    Content:         0000000000000000
38368616584SIgor Kudrin  - Name:            baz
38468616584SIgor Kudrin    Type:            SHT_NOTE
38568616584SIgor Kudrin    Flags:           [ SHF_ALLOC ]
38668616584SIgor Kudrin    Address:         0x18
38768616584SIgor Kudrin    Offset:          0x1018
38868616584SIgor Kudrin    Content:         0000000000000000
38968616584SIgor Kudrin  - Type:            SectionHeaderTable
39068616584SIgor Kudrin    Sections:
39168616584SIgor Kudrin## Note: the order of section headers differs from their layout.
39268616584SIgor Kudrin      - Name:            foo
39368616584SIgor Kudrin      - Name:            bar
39468616584SIgor Kudrin      - Name:            baz
39568616584SIgor Kudrin      - Name:            qux
39668616584SIgor Kudrin      - Name:            .shstrtab
39768616584SIgor Kudrin      - Name:            .strtab
398