Handle 0 sized sections like any other section.

This is a case where there is inconsistency among ELF linkers:

* The spec says nothing special about empty sections.
* BFD ld removes them.
* Gold handles them like regular sections.

We were outputting them but sometimes ignoring them. This would create
odd looking outputs where a rw section could be in a ro segment for example.

The bfd way of doing things is also strange for the case where a symbol
points to the empty section.

Now we match gold and what seems to be the intention of the spec.

llvm-svn: 251988
This commit is contained in:
Rafael Espindola 2015-11-03 22:08:08 +00:00
parent d7a267b84b
commit 61362ce876
13 changed files with 105 additions and 82 deletions

View File

@ -698,27 +698,24 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
// Create phdrs as we assign VAs and file offsets to all output sections.
SmallPtrSet<Elf_Phdr *, 8> Closed;
for (OutputSectionBase<ELFT> *Sec : OutputSections) {
if (Sec->getSize()) {
uintX_t Flags = toPhdrFlags(Sec->getFlags());
Elf_Phdr *Last = &Phdrs[PhdrIdx];
if (Last->p_flags != Flags || !needsPhdr<ELFT>(Sec)) {
// Flags changed. End current Phdr and potentially create a new one.
if (Closed.insert(Last).second) {
Last->p_filesz = FileOff - Last->p_offset;
Last->p_memsz = VA - Last->p_vaddr;
}
uintX_t Flags = toPhdrFlags(Sec->getFlags());
Elf_Phdr *Last = &Phdrs[PhdrIdx];
if (Last->p_flags != Flags || !needsPhdr<ELFT>(Sec)) {
// Flags changed. End current Phdr and potentially create a new one.
if (Closed.insert(Last).second) {
Last->p_filesz = FileOff - Last->p_offset;
Last->p_memsz = VA - Last->p_vaddr;
}
if (needsPhdr<ELFT>(Sec)) {
VA = RoundUpToAlignment(VA, Target->getPageSize());
FileOff = RoundUpToAlignment(FileOff, Target->getPageSize());
Elf_Phdr *PH = &Phdrs[++PhdrIdx];
setPhdr(PH, PT_LOAD, Flags, FileOff, VA, 0, Target->getPageSize());
}
if (needsPhdr<ELFT>(Sec)) {
VA = RoundUpToAlignment(VA, Target->getPageSize());
FileOff = RoundUpToAlignment(FileOff, Target->getPageSize());
Elf_Phdr *PH = &Phdrs[++PhdrIdx];
setPhdr(PH, PT_LOAD, Flags, FileOff, VA, 0, Target->getPageSize());
}
}
if (Sec->getSize() && (Sec->getFlags() & SHF_ALLOC) &&
(Sec->getFlags() & SHF_TLS)) {
if ((Sec->getFlags() & SHF_ALLOC) && (Sec->getFlags() & SHF_TLS)) {
if (!TlsPhdr.p_vaddr)
setPhdr(&TlsPhdr, PT_TLS, PF_R, FileOff, VA, 0, Sec->getAlign());
if (Sec->getType() != SHT_NOBITS)
@ -776,7 +773,7 @@ template <class ELFT> int Writer<ELFT>::getPhdrsNum() const {
++I;
uintX_t Last = PF_R;
for (OutputSectionBase<ELFT> *Sec : OutputSections) {
if (!Sec->getSize() || !needsPhdr<ELFT>(Sec))
if (!needsPhdr<ELFT>(Sec))
continue;
if (Sec->getFlags() & SHF_TLS)
Tls = true;

View File

@ -27,12 +27,12 @@ __start:
# CHECK-NEXT: Version: 1
# CHECK-NEXT: Entry: 0x20000
# CHECK-NEXT: ProgramHeaderOffset: 0x34
# CHECK-NEXT: SectionHeaderOffset: 0x10080
# CHECK-NEXT: SectionHeaderOffset: 0x20070
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 52
# CHECK-NEXT: ProgramHeaderEntrySize: 32
# CHECK-NEXT: ProgramHeaderCount: 3
# CHECK-NEXT: ProgramHeaderCount: 4
# CHECK-NEXT: SectionHeaderEntrySize: 40
# CHECK-NEXT: SectionHeaderCount: 9
# CHECK-NEXT: StringTableSectionIndex: 7
@ -59,8 +59,8 @@ __start:
# CHECK-NEXT: Flags [ (0x2)
# CHECK-NEXT: SHF_ALLOC (0x2)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x10094
# CHECK-NEXT: Offset: 0x94
# CHECK-NEXT: Address: 0x100B4
# CHECK-NEXT: Offset: 0xB4
# CHECK-NEXT: Size: 24
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -74,8 +74,8 @@ __start:
# CHECK-NEXT: Flags [ (0x2)
# CHECK-NEXT: SHF_ALLOC (0x2)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x100B0
# CHECK-NEXT: Offset: 0xB0
# CHECK-NEXT: Address: 0x100D0
# CHECK-NEXT: Offset: 0xD0
# CHECK-NEXT: Size: 24
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -106,8 +106,8 @@ __start:
# CHECK-NEXT: SHF_ALLOC (0x2)
# CHECK-NEXT: SHF_WRITE (0x1)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x20010
# CHECK-NEXT: Offset: 0x10010
# CHECK-NEXT: Address: 0x30000
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -122,8 +122,8 @@ __start:
# CHECK-NEXT: SHF_ALLOC (0x2)
# CHECK-NEXT: SHF_WRITE (0x1)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x20010
# CHECK-NEXT: Offset: 0x10010
# CHECK-NEXT: Address: 0x30000
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -137,7 +137,7 @@ __start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x10010
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: Size: 32
# CHECK-NEXT: Link: 8
# CHECK-NEXT: Info: 1
@ -151,7 +151,7 @@ __start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x10030
# CHECK-NEXT: Offset: 0x20020
# CHECK-NEXT: Size: 68
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -165,7 +165,7 @@ __start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x10074
# CHECK-NEXT: Offset: 0x20064
# CHECK-NEXT: Size: 9
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -199,8 +199,8 @@ __start:
# CHECK-NEXT: Offset: 0x34
# CHECK-NEXT: VirtualAddress: 0x10034
# CHECK-NEXT: PhysicalAddress: 0x10034
# CHECK-NEXT: FileSize: 96
# CHECK-NEXT: MemSize: 96
# CHECK-NEXT: FileSize: 128
# CHECK-NEXT: MemSize: 128
# CHECK-NEXT: Flags [ (0x4)
# CHECK-NEXT: PF_R (0x4)
# CHECK-NEXT: ]
@ -211,8 +211,8 @@ __start:
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x10000
# CHECK-NEXT: PhysicalAddress: 0x10000
# CHECK-NEXT: FileSize: 200
# CHECK-NEXT: MemSize: 200
# CHECK-NEXT: FileSize: 232
# CHECK-NEXT: MemSize: 232
# CHECK-NEXT: Flags [ (0x4)
# CHECK-NEXT: PF_R (0x4)
# CHECK-NEXT: ]
@ -223,12 +223,25 @@ __start:
# CHECK-NEXT: Offset: 0x10000
# CHECK-NEXT: VirtualAddress: 0x20000
# CHECK-NEXT: PhysicalAddress: 0x20000
# CHECK-NEXT: FileSize: 16
# CHECK-NEXT: MemSize: 16
# CHECK-NEXT: FileSize: 12
# CHECK-NEXT: MemSize: 12
# CHECK-NEXT: Flags [ (0x5)
# CHECK-NEXT: PF_R (0x4)
# CHECK-NEXT: PF_X (0x1)
# CHECK-NEXT: ]
# CHECK-NEXT: Alignment: 65536
# CHECK-NEXT: }
# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: VirtualAddress: 0x30000
# CHECK-NEXT: PhysicalAddress: 0x30000
# CHECK-NEXT: FileSize: 0
# CHECK-NEXT: MemSize: 0
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: PF_W
# CHECK-NEXT: ]
# CHECK-NEXT: Alignment: 65536
# CHECK-NEXT: }
# CHECK-NEXT: ]

View File

@ -40,7 +40,7 @@ _start:
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
// CHECK-NEXT: Value: 0x100B0
// CHECK-NEXT: Value: 0x11000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None

View File

@ -36,7 +36,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: .Lmyothervar
// CHECK-NEXT: Value: 0x14C
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -45,7 +45,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: .Lmyvar
// CHECK-NEXT: Value: 0x14C
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None

View File

@ -16,14 +16,14 @@
# X86-64-NEXT: Type: Executable (0x2)
# X86-64-NEXT: Machine: EM_X86_64 (0x3E)
# X86-64-NEXT: Version: 1
# X86-64-NEXT: Entry: 0x100B0
# X86-64-NEXT: Entry:
# X86-64-NEXT: ProgramHeaderOffset: 0x40
# X86-64-NEXT: SectionHeaderOffset:
# X86-64-NEXT: Flags [ (0x0)
# X86-64-NEXT: ]
# X86-64-NEXT: HeaderSize: 64
# X86-64-NEXT: ProgramHeaderEntrySize: 56
# X86-64-NEXT: ProgramHeaderCount: 2
# X86-64-NEXT: ProgramHeaderCount:
# X86-64-NEXT: SectionHeaderEntrySize: 64
# X86-64-NEXT: SectionHeaderCount:
# X86-64-NEXT: StringTableSectionIndex:
@ -47,14 +47,14 @@
# X86-NEXT: Type: Executable (0x2)
# X86-NEXT: Machine: EM_386 (0x3)
# X86-NEXT: Version: 1
# X86-NEXT: Entry: 0x10074
# X86-NEXT: Entry:
# X86-NEXT: ProgramHeaderOffset: 0x34
# X86-NEXT: SectionHeaderOffset:
# X86-NEXT: Flags [ (0x0)
# X86-NEXT: ]
# X86-NEXT: HeaderSize: 52
# X86-NEXT: ProgramHeaderEntrySize: 32
# X86-NEXT: ProgramHeaderCount: 2
# X86-NEXT: ProgramHeaderCount:
# X86-NEXT: SectionHeaderEntrySize: 40
# X86-NEXT: SectionHeaderCount:
# X86-NEXT: StringTableSectionIndex:
@ -78,14 +78,14 @@
# PPC64-NEXT: Type: Executable (0x2)
# PPC64-NEXT: Machine: EM_PPC64 (0x15)
# PPC64-NEXT: Version: 1
# PPC64-NEXT: Entry: 0x100000B0
# PPC64-NEXT: Entry:
# PPC64-NEXT: ProgramHeaderOffset: 0x40
# PPC64-NEXT: SectionHeaderOffset:
# PPC64-NEXT: Flags [ (0x0)
# PPC64-NEXT: ]
# PPC64-NEXT: HeaderSize: 64
# PPC64-NEXT: ProgramHeaderEntrySize: 56
# PPC64-NEXT: ProgramHeaderCount: 2
# PPC64-NEXT: ProgramHeaderCount:
# PPC64-NEXT: SectionHeaderEntrySize: 64
# PPC64-NEXT: SectionHeaderCount:
# PPC64-NEXT: StringTableSectionIndex:
@ -109,9 +109,9 @@
# MIPS-NEXT: Type: Executable (0x2)
# MIPS-NEXT: Machine: EM_MIPS (0x8)
# MIPS-NEXT: Version: 1
# MIPS-NEXT: Entry: 0x100B0
# MIPS-NEXT: Entry:
# MIPS-NEXT: ProgramHeaderOffset: 0x34
# MIPS-NEXT: SectionHeaderOffset: 0x11C
# MIPS-NEXT: SectionHeaderOffset:
# MIPS-NEXT: Flags [ (0x0)
# MIPS-NEXT: ]
@ -135,9 +135,9 @@
# MIPSEL-NEXT: Type: Executable (0x2)
# MIPSEL-NEXT: Machine: EM_MIPS (0x8)
# MIPSEL-NEXT: Version: 1
# MIPSEL-NEXT: Entry: 0x100B0
# MIPSEL-NEXT: Entry:
# MIPSEL-NEXT: ProgramHeaderOffset: 0x34
# MIPSEL-NEXT: SectionHeaderOffset: 0x11C
# MIPSEL-NEXT: SectionHeaderOffset:
# MIPSEL-NEXT: Flags [ (0x0)
# MIPSEL-NEXT: ]

View File

@ -149,8 +149,8 @@
# PPC64-NEXT: Flags [
# PPC64-NEXT: SHF_ALLOC
# PPC64-NEXT: ]
# PPC64-NEXT: Address: 0x180
# PPC64-NEXT: Offset: 0x180
# PPC64-NEXT: Address: 0x1B8
# PPC64-NEXT: Offset: 0x1B8
# PPC64-NEXT: Size: 36
# PPC64-NEXT: Link: 1
# PPC64-NEXT: Info: 0

View File

@ -16,7 +16,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: blah
// CHECK-NEXT: Value: 0x170
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -25,7 +25,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: foo
// CHECK-NEXT: Value: 0x170
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -34,7 +34,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: goo
// CHECK-NEXT: Value: 0x170
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -43,7 +43,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
// CHECK-NEXT: Value: 0x170
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None
@ -64,7 +64,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start@
// CHECK-NEXT: Value: 0x170
// CHECK-NEXT: Value: 0x1000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None

View File

@ -37,7 +37,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: blah
// CHECK-NEXT: Value: 0x100B0
// CHECK-NEXT: Value: 0x11000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -46,7 +46,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: foo
// CHECK-NEXT: Value: 0x100B0
// CHECK-NEXT: Value: 0x11000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -55,7 +55,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: goo
// CHECK-NEXT: Value: 0x100B0
// CHECK-NEXT: Value: 0x11000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: None
@ -64,7 +64,7 @@
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: _start
// CHECK-NEXT: Value: 0x100B0
// CHECK-NEXT: Value: 0x11000
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None

View File

@ -17,8 +17,8 @@
// CHECK-NEXT: SHF_MERGE
// CHECK-NEXT: SHF_STRINGS
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x120
// CHECK-NEXT: Offset: 0x120
// CHECK-NEXT: Address:
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 4
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
@ -31,8 +31,8 @@
// CHECK-NEXT: SHF_MERGE
// CHECK-NEXT: SHF_STRINGS
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x124
// CHECK-NEXT: Offset: 0x124
// CHECK-NEXT: Address:
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 4
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0

View File

@ -26,8 +26,8 @@ zed:
// CHECK-NEXT: SHF_MERGE
// CHECK-NEXT: SHF_STRINGS
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x120
// CHECK-NEXT: Offset: 0x120
// CHECK-NEXT: Address: 0x158
// CHECK-NEXT: Offset: 0x158
// CHECK-NEXT: Size: 4
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
@ -44,8 +44,8 @@ zed:
// NOTAIL-NEXT: SHF_MERGE
// NOTAIL-NEXT: SHF_STRINGS
// NOTAIL-NEXT: ]
// NOTAIL-NEXT: Address: 0x120
// NOTAIL-NEXT: Offset: 0x120
// NOTAIL-NEXT: Address: 0x158
// NOTAIL-NEXT: Offset: 0x158
// NOTAIL-NEXT: Size: 7
// NOTAIL-NEXT: Link: 0
// NOTAIL-NEXT: Info: 0
@ -62,8 +62,8 @@ zed:
// CHECK-NEXT: SHF_MERGE
// CHECK-NEXT: SHF_STRINGS
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x124
// CHECK-NEXT: Offset: 0x124
// CHECK-NEXT: Address: 0x15C
// CHECK-NEXT: Offset: 0x15C
// CHECK-NEXT: Size: 4
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
@ -75,11 +75,11 @@ zed:
// CHECK: Name: bar
// CHECK-NEXT: Value: 0x121
// CHECK-NEXT: Value: 0x159
// CHECK: Name: foo
// CHECK-NEXT: Value: 0x120
// CHECK-NEXT: Value: 0x158
// CHECK: Name: zed
// CHECK-NEXT: Value: 0x124
// CHECK-NEXT: Value: 0x15C
// CHECK-NEXT: Size: 0

View File

@ -15,7 +15,7 @@ foo:
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_MERGE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x120
// CHECK-NEXT: Address: 0x158
// CHECK: Name: foo
// CHECK-NEXT: Value: 0x122
// CHECK-NEXT: Value: 0x15A

View File

@ -23,7 +23,7 @@ _start:
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: ]
# CHECK-NEXT: Address:
# CHECK-NEXT: Offset: 0xE8
# CHECK-NEXT: Offset: 0x120
# CHECK-NEXT: Size:
# CHECK-NEXT: Link:
# CHECK-NEXT: Info:
@ -37,8 +37,8 @@ _start:
# CHECK-NEXT: Offset: 0x40
# CHECK-NEXT: VirtualAddress: 0x10040
# CHECK-NEXT: PhysicalAddress: 0x10040
# CHECK-NEXT: FileSize: 168
# CHECK-NEXT: MemSize: 168
# CHECK-NEXT: FileSize: 224
# CHECK-NEXT: MemSize: 224
# CHECK-NEXT: Flags [ (0x4)
# CHECK-NEXT: PF_R (0x4)
# CHECK-NEXT: ]
@ -49,8 +49,8 @@ _start:
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress:
# CHECK-NEXT: PhysicalAddress:
# CHECK-NEXT: FileSize: 240
# CHECK-NEXT: MemSize: 240
# CHECK-NEXT: FileSize: 296
# CHECK-NEXT: MemSize: 296
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: ]
@ -61,6 +61,19 @@ _start:
# CHECK-NEXT: Offset:
# CHECK-NEXT: VirtualAddress:
# CHECK-NEXT: PhysicalAddress:
# CHECK-NEXT: FileSize: 0
# CHECK-NEXT: MemSize: 0
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: PF_X
# CHECK-NEXT: ]
# CHECK-NEXT: Alignment:
# CHECK-NEXT: }
# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD
# CHECK-NEXT: Offset:
# CHECK-NEXT: VirtualAddress:
# CHECK-NEXT: PhysicalAddress:
# CHECK-NEXT: FileSize: 16
# CHECK-NEXT: MemSize: 16
# CHECK-NEXT: Flags [

View File

@ -19,7 +19,7 @@ _start:
// CHECK-NEXT: Flags [
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x100B0
// CHECK-NEXT: Address: 0x100E8
// CHECK: Name: foobar
// CHECK-NEXT: Type: SHT_PROGBITS