Skip to content

Commit a4ae837

Browse files
committed
[Object][ELF] Support extended header for Object Parser in ELF
In ELF file, there is a possible extended header for those phnum, shnum, and shstrndx larger than the maximum of 16 bits. This extended header use section 0 to record these fields in 32 bits. For most of the ELF writers like lld, we already have the mechanism to synthesis this special section 0. However, the parser part don't have such infra and therefore we add it. Also, we modify some test cases. For those expected-error test cases, their error emission get early. For those expected-correct test cases, we modify the output since we support more than 65535 sections now.
1 parent 69761e7 commit a4ae837

File tree

8 files changed

+143
-88
lines changed

8 files changed

+143
-88
lines changed

lld/ELF/SyntheticSections.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4428,7 +4428,6 @@ void elf::writeEhdr(Ctx &ctx, uint8_t *buf, Partition &part) {
44284428
eHdr->e_version = EV_CURRENT;
44294429
eHdr->e_flags = ctx.arg.eflags;
44304430
eHdr->e_ehsize = sizeof(typename ELFT::Ehdr);
4431-
eHdr->e_phnum = part.phdrs.size();
44324431
eHdr->e_shentsize = sizeof(typename ELFT::Shdr);
44334432

44344433
if (!ctx.arg.relocatable) {

lld/ELF/Writer.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2907,7 +2907,8 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
29072907
// the value. The sentinel values and fields are:
29082908
// e_shnum = 0, SHdrs[0].sh_size = number of sections.
29092909
// e_shstrndx = SHN_XINDEX, SHdrs[0].sh_link = .shstrtab section index.
2910-
auto *sHdrs = reinterpret_cast<Elf_Shdr *>(ctx.bufferStart + eHdr->e_shoff);
2910+
// e_phnum = 0xFFFF, SHdrs[0]
2911+
auto *sHdrs = reinterpret_cast<Elf_Shdr *>(ctx.bufferStart + eHdr->e_smhoff);
29112912
size_t num = ctx.outputSections.size() + 1;
29122913
if (num >= SHN_LORESERVE)
29132914
sHdrs->sh_size = num;
@@ -2922,6 +2923,14 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
29222923
eHdr->e_shstrndx = strTabIndex;
29232924
}
29242925

2926+
num = part.phdrs.size();
2927+
if (num >= 0xFFFF) {
2928+
eHdr->e_phnum = 0xFFFF;
2929+
sHdrs->sh_info = num;
2930+
} else {
2931+
eHdr->e_phnum = num;
2932+
}
2933+
29252934
for (OutputSection *sec : ctx.outputSections)
29262935
sec->writeHeaderTo<ELFT>(++sHdrs);
29272936
}

llvm/include/llvm/Object/ELF.h

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -278,9 +278,17 @@ class ELFFile {
278278
std::vector<Elf_Shdr> FakeSections;
279279
SmallString<0> FakeSectionStrings;
280280

281+
// Handle extended header in section 0
282+
Elf_Word e_phnum;
283+
Elf_Word e_shnum;
284+
Elf_Word e_shstrndx;
285+
281286
ELFFile(StringRef Object);
282287

283288
public:
289+
const Elf_Word getPhNum() const { return e_phnum; }
290+
const Elf_Word getShNum() const { return e_shnum; }
291+
const Elf_Word getShStrNdx() const { return e_shstrndx; }
284292
const Elf_Ehdr &getHeader() const {
285293
return *reinterpret_cast<const Elf_Ehdr *>(base());
286294
}
@@ -379,22 +387,21 @@ class ELFFile {
379387

380388
/// Iterate over program header table.
381389
Expected<Elf_Phdr_Range> program_headers() const {
382-
if (getHeader().e_phnum && getHeader().e_phentsize != sizeof(Elf_Phdr))
390+
if (e_phnum && getHeader().e_phentsize != sizeof(Elf_Phdr))
383391
return createError("invalid e_phentsize: " +
384392
Twine(getHeader().e_phentsize));
385393

386-
uint64_t HeadersSize =
387-
(uint64_t)getHeader().e_phnum * getHeader().e_phentsize;
394+
uint64_t HeadersSize = (uint64_t)e_phnum * getHeader().e_phentsize;
388395
uint64_t PhOff = getHeader().e_phoff;
389396
if (PhOff + HeadersSize < PhOff || PhOff + HeadersSize > getBufSize())
390397
return createError("program headers are longer than binary of size " +
391398
Twine(getBufSize()) + ": e_phoff = 0x" +
392399
Twine::utohexstr(getHeader().e_phoff) +
393-
", e_phnum = " + Twine(getHeader().e_phnum) +
400+
", e_phnum = " + Twine(e_phnum) +
394401
", e_phentsize = " + Twine(getHeader().e_phentsize));
395402

396403
auto *Begin = reinterpret_cast<const Elf_Phdr *>(base() + PhOff);
397-
return ArrayRef(Begin, Begin + getHeader().e_phnum);
404+
return ArrayRef(Begin, Begin + e_phnum);
398405
}
399406

400407
/// Get an iterator over notes in a program header.
@@ -772,7 +779,7 @@ template <class ELFT>
772779
Expected<StringRef>
773780
ELFFile<ELFT>::getSectionStringTable(Elf_Shdr_Range Sections,
774781
WarningHandler WarnHandler) const {
775-
uint32_t Index = getHeader().e_shstrndx;
782+
uint32_t Index = e_shstrndx;
776783
if (Index == ELF::SHN_XINDEX) {
777784
// If the section name string table section index is greater than
778785
// or equal to SHN_LORESERVE, then the actual index of the section name
@@ -889,15 +896,42 @@ Expected<uint64_t> ELFFile<ELFT>::getDynSymtabSize() const {
889896
return 0;
890897
}
891898

892-
template <class ELFT> ELFFile<ELFT>::ELFFile(StringRef Object) : Buf(Object) {}
899+
template <class ELFT> ELFFile<ELFT>::ELFFile(StringRef Object) : Buf(Object) {
900+
auto Header = getHeader();
901+
e_phnum = Header.e_phnum;
902+
e_shnum = Header.e_shnum;
903+
e_shstrndx = Header.e_shstrndx;
904+
}
893905

894906
template <class ELFT>
895907
Expected<ELFFile<ELFT>> ELFFile<ELFT>::create(StringRef Object) {
896908
if (sizeof(Elf_Ehdr) > Object.size())
897909
return createError("invalid buffer: the size (" + Twine(Object.size()) +
898910
") is smaller than an ELF header (" +
899911
Twine(sizeof(Elf_Ehdr)) + ")");
900-
return ELFFile(Object);
912+
ELFFile Result(Object);
913+
914+
//
915+
// sections() parse the total number of sections by considering the
916+
// extended headers
917+
//
918+
if (Result.getHeader().HasHeaderExtension()) {
919+
auto TableOrErr = Result.sections();
920+
if (!TableOrErr)
921+
return TableOrErr.takeError();
922+
if ((*TableOrErr).size() == 0)
923+
return Result;
924+
auto SecOrErr = object::getSection<ELFT>(*TableOrErr, 0);
925+
if (!SecOrErr)
926+
return SecOrErr.takeError();
927+
if (Result.e_phnum == 0xFFFF)
928+
Result.e_phnum = (*SecOrErr)->sh_info;
929+
if (Result.e_shnum == ELF::SHN_UNDEF)
930+
Result.e_shnum = (*SecOrErr)->sh_size;
931+
if (Result.e_shstrndx == ELF::SHN_XINDEX)
932+
Result.e_shstrndx = (*SecOrErr)->sh_link;
933+
}
934+
return Result;
901935
}
902936

903937
/// Used by llvm-objdump -d (which needs sections for disassembly) to
@@ -940,7 +974,6 @@ Expected<typename ELFT::ShdrRange> ELFFile<ELFT>::sections() const {
940974
if (getHeader().e_shentsize != sizeof(Elf_Shdr))
941975
return createError("invalid e_shentsize in ELF header: " +
942976
Twine(getHeader().e_shentsize));
943-
944977
const uint64_t FileSize = Buf.size();
945978
if (SectionTableOffset + sizeof(Elf_Shdr) > FileSize ||
946979
SectionTableOffset + (uintX_t)sizeof(Elf_Shdr) < SectionTableOffset)
@@ -956,7 +989,7 @@ Expected<typename ELFT::ShdrRange> ELFFile<ELFT>::sections() const {
956989
const Elf_Shdr *First =
957990
reinterpret_cast<const Elf_Shdr *>(base() + SectionTableOffset);
958991

959-
uintX_t NumSections = getHeader().e_shnum;
992+
uintX_t NumSections = e_shnum;
960993
if (NumSections == 0)
961994
NumSections = First->sh_size;
962995

llvm/include/llvm/Object/ELFTypes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,11 @@ struct Elf_Ehdr_Impl {
529529

530530
unsigned char getFileClass() const { return e_ident[ELF::EI_CLASS]; }
531531
unsigned char getDataEncoding() const { return e_ident[ELF::EI_DATA]; }
532+
bool HasHeaderExtension() const {
533+
return (e_phnum == 0xFFFF || e_shnum == ELF::SHN_UNDEF ||
534+
ELF::SHN_XINDEX == e_phnum) &&
535+
e_shoff != 0;
536+
}
532537
};
533538

534539
template <endianness Endianness>

llvm/test/Object/invalid.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ Sections:
556556
# RUN: yaml2obj --docnum=25 %s -o %t25
557557
# RUN: not llvm-readobj -h %t25 2>&1 | FileCheck -DFILE=%t25 --check-prefix=INVALID-SEC-NUM1 %s
558558

559-
# INVALID-SEC-NUM1: error: '[[FILE]]': unable to continue dumping, the file is corrupt: invalid section header table offset (e_shoff = 0x58) or invalid number of sections specified in the first section header's sh_size field (0x3ffffffffffffff)
559+
# INVALID-SEC-NUM1: error: '[[FILE]]': invalid section header table offset (e_shoff = 0x58) or invalid number of sections specified in the first section header's sh_size field (0x3ffffffffffffff)
560560

561561
--- !ELF
562562
FileHeader:
@@ -575,7 +575,7 @@ Sections:
575575
# RUN: yaml2obj --docnum=26 %s -o %t26
576576
# RUN: not llvm-readobj -h %t26 2>&1 | FileCheck -DFILE=%t26 --check-prefix=INVALID-SEC-NUM2 %s
577577

578-
# INVALID-SEC-NUM2: error: '[[FILE]]': unable to continue dumping, the file is corrupt: invalid number of sections specified in the NULL section's sh_size field (288230376151711744)
578+
# INVALID-SEC-NUM2: error: '[[FILE]]': invalid number of sections specified in the NULL section's sh_size field (288230376151711744)
579579

580580
--- !ELF
581581
FileHeader:

llvm/test/tools/llvm-objcopy/ELF/many-sections.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ RUN: llvm-readobj --file-headers --sections --symbols %t2 | FileCheck %s
66
RUN: llvm-readelf --symbols %t2 | FileCheck --check-prefix=SYMS %s
77

88
## The ELF header should have e_shnum == 0 and e_shstrndx == SHN_XINDEX.
9-
# CHECK: SectionHeaderCount: 0
9+
# CHECK: SectionHeaderCount: 0 (65540)
1010
# CHECK-NEXT: StringTableSectionIndex: 65535
1111

1212
## The first section header should store the real section header count and

llvm/test/tools/llvm-readobj/ELF/file-headers.test

Lines changed: 63 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -143,64 +143,67 @@ FileHeader:
143143
# RUN: yaml2obj %s --docnum=4 -o %t.invalid1
144144
# RUN: not llvm-readobj --file-headers %t.invalid1 2>&1 \
145145
# RUN: | FileCheck %s --implicit-check-not=warning: -DFILE=%t.invalid1 \
146-
# RUN: -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-LLVM
146+
# RUN: -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-LLVM-TC1
147147
# RUN: not llvm-readelf --file-headers %t.invalid1 2>&1 \
148148
# RUN: | FileCheck %s --implicit-check-not=warning: -DFILE=%t.invalid1 \
149-
# RUN: -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-GNU
150-
151-
# INVALID-LLVM: File: [[FILE]]
152-
# INVALID-LLVM-NEXT: Format: elf64-unknown
153-
# INVALID-LLVM-NEXT: Arch: unknown
154-
# INVALID-LLVM-NEXT: AddressSize: 64bit
155-
# INVALID-LLVM-NEXT: LoadName: <Not found>
156-
# INVALID-LLVM-NEXT: ElfHeader {
157-
# INVALID-LLVM-NEXT: Ident {
158-
# INVALID-LLVM-NEXT: Magic: (7F 45 4C 46)
159-
# INVALID-LLVM-NEXT: Class: 64-bit (0x2)
160-
# INVALID-LLVM-NEXT: DataEncoding: LittleEndian (0x1)
161-
# INVALID-LLVM-NEXT: FileVersion: 1
162-
# INVALID-LLVM-NEXT: OS/ABI: SystemV (0x0)
163-
# INVALID-LLVM-NEXT: ABIVersion: 0
164-
# INVALID-LLVM-NEXT: Unused: (00 00 00 00 00 00 00)
165-
# INVALID-LLVM-NEXT: }
166-
# INVALID-LLVM-NEXT: Type: Relocatable (0x1)
167-
# INVALID-LLVM-NEXT: Machine: EM_NONE (0x0)
168-
# INVALID-LLVM-NEXT: Version: 1
169-
# INVALID-LLVM-NEXT: Entry: 0x0
170-
# INVALID-LLVM-NEXT: ProgramHeaderOffset: 0x0
171-
# INVALID-LLVM-NEXT: SectionHeaderOffset: 0x1000
172-
# INVALID-LLVM-NEXT: Flags [ (0x0)
173-
# INVALID-LLVM-NEXT: ]
174-
# INVALID-LLVM-NEXT: HeaderSize: 64
175-
# INVALID-LLVM-NEXT: ProgramHeaderEntrySize: 0
176-
# INVALID-LLVM-NEXT: ProgramHeaderCount: 0
177-
# INVALID-LLVM-NEXT: SectionHeaderEntrySize: 64
178-
# INVALID-LLVM-NEXT: SectionHeaderCount: [[SECHDRCOUNT]]
179-
# INVALID-LLVM-NEXT: StringTableSectionIndex: [[SECHDRSTRTABINDEX]]
180-
# INVALID-LLVM-NEXT: }
181-
# INVALID-LLVM-NEXT: error: '[[FILE]]': unable to continue dumping, the file is corrupt: section header table goes past the end of the file: e_shoff = 0x1000
182-
183-
# INVALID-GNU: ELF Header:
184-
# INVALID-GNU-NEXT: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
185-
# INVALID-GNU-NEXT: Class: ELF64
186-
# INVALID-GNU-NEXT: Data: 2's complement, little endian
187-
# INVALID-GNU-NEXT: Version: 1 (current)
188-
# INVALID-GNU-NEXT: OS/ABI: UNIX - System V
189-
# INVALID-GNU-NEXT: ABI Version: 0
190-
# INVALID-GNU-NEXT: Type: REL (Relocatable file)
191-
# INVALID-GNU-NEXT: Machine: None
192-
# INVALID-GNU-NEXT: Version: 0x1
193-
# INVALID-GNU-NEXT: Entry point address: 0x0
194-
# INVALID-GNU-NEXT: Start of program headers: 0 (bytes into file)
195-
# INVALID-GNU-NEXT: Start of section headers: 4096 (bytes into file)
196-
# INVALID-GNU-NEXT: Flags: 0x0
197-
# INVALID-GNU-NEXT: Size of this header: 64 (bytes)
198-
# INVALID-GNU-NEXT: Size of program headers: 0 (bytes)
199-
# INVALID-GNU-NEXT: Number of program headers: 0
200-
# INVALID-GNU-NEXT: Size of section headers: 64 (bytes)
201-
# INVALID-GNU-NEXT: Number of section headers: [[SECHDRCOUNT]]
202-
# INVALID-GNU-NEXT: Section header string table index: [[SECHDRSTRTABINDEX]]
203-
# INVALID-GNU-NEXT: error: '[[FILE]]': unable to continue dumping, the file is corrupt: section header table goes past the end of the file: e_shoff = 0x1000
149+
# RUN: -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-GNU-TC1
150+
151+
# INVALID-LLVM-TC1: File: [[FILE]]
152+
# INVALID-LLVM-TC1-NEXT: Format: elf64-unknown
153+
# INVALID-LLVM-TC1-NEXT: Arch: unknown
154+
# INVALID-LLVM-TC1-NEXT: AddressSize: 64bit
155+
# INVALID-LLVM-TC1-NEXT: LoadName: <Not found>
156+
# INVALID-LLVM-TC1-NEXT: ElfHeader {
157+
# INVALID-LLVM-TC1-NEXT: Ident {
158+
# INVALID-LLVM-TC1-NEXT: Magic: (7F 45 4C 46)
159+
# INVALID-LLVM-TC1-NEXT: Class: 64-bit (0x2)
160+
# INVALID-LLVM-TC1-NEXT: DataEncoding: LittleEndian (0x1)
161+
# INVALID-LLVM-TC1-NEXT: FileVersion: 1
162+
# INVALID-LLVM-TC1-NEXT: OS/ABI: SystemV (0x0)
163+
# INVALID-LLVM-TC1-NEXT: ABIVersion: 0
164+
# INVALID-LLVM-TC1-NEXT: Unused: (00 00 00 00 00 00 00)
165+
# INVALID-LLVM-TC1-NEXT: }
166+
# INVALID-LLVM-TC1-NEXT: Type: Relocatable (0x1)
167+
# INVALID-LLVM-TC1-NEXT: Machine: EM_NONE (0x0)
168+
# INVALID-LLVM-TC1-NEXT: Version: 1
169+
# INVALID-LLVM-TC1-NEXT: Entry: 0x0
170+
# INVALID-LLVM-TC1-NEXT: ProgramHeaderOffset: 0x0
171+
# INVALID-LLVM-TC1-NEXT: SectionHeaderOffset: 0x1000
172+
# INVALID-LLVM-TC1-NEXT: Flags [ (0x0)
173+
# INVALID-LLVM-TC1-NEXT: ]
174+
# INVALID-LLVM-TC1-NEXT: HeaderSize: 64
175+
# INVALID-LLVM-TC1-NEXT: ProgramHeaderEntrySize: 0
176+
# INVALID-LLVM-TC1-NEXT: ProgramHeaderCount: 0
177+
# INVALID-LLVM-TC1-NEXT: SectionHeaderEntrySize: 64
178+
# INVALID-LLVM-TC1-NEXT: SectionHeaderCount: [[SECHDRCOUNT]]
179+
# INVALID-LLVM-TC1-NEXT: StringTableSectionIndex: [[SECHDRSTRTABINDEX]]
180+
# INVALID-LLVM-TC1-NEXT: }
181+
# INVALID-LLVM-TC1-NEXT: error: '[[FILE]]': unable to continue dumping, the file is corrupt: section header table goes past the end of the file: e_shoff = 0x1000
182+
183+
# INVALID-GNU-TC1: ELF Header:
184+
# INVALID-GNU-TC1-NEXT: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
185+
# INVALID-GNU-TC1-NEXT: Class: ELF64
186+
# INVALID-GNU-TC1-NEXT: Data: 2's complement, little endian
187+
# INVALID-GNU-TC1-NEXT: Version: 1 (current)
188+
# INVALID-GNU-TC1-NEXT: OS/ABI: UNIX - System V
189+
# INVALID-GNU-TC1-NEXT: ABI Version: 0
190+
# INVALID-GNU-TC1-NEXT: Type: REL (Relocatable file)
191+
# INVALID-GNU-TC1-NEXT: Machine: None
192+
# INVALID-GNU-TC1-NEXT: Version: 0x1
193+
# INVALID-GNU-TC1-NEXT: Entry point address: 0x0
194+
# INVALID-GNU-TC1-NEXT: Start of program headers: 0 (bytes into file)
195+
# INVALID-GNU-TC1-NEXT: Start of section headers: 4096 (bytes into file)
196+
# INVALID-GNU-TC1-NEXT: Flags: 0x0
197+
# INVALID-GNU-TC1-NEXT: Size of this header: 64 (bytes)
198+
# INVALID-GNU-TC1-NEXT: Size of program headers: 0 (bytes)
199+
# INVALID-GNU-TC1-NEXT: Number of program headers: 0
200+
# INVALID-GNU-TC1-NEXT: Size of section headers: 64 (bytes)
201+
# INVALID-GNU-TC1-NEXT: Number of section headers: [[SECHDRCOUNT]]
202+
# INVALID-GNU-TC1-NEXT: Section header string table index: [[SECHDRSTRTABINDEX]]
203+
# INVALID-GNU-TC1-NEXT: error: '[[FILE]]': unable to continue dumping, the file is corrupt: section header table goes past the end of the file: e_shoff = 0x1000
204+
205+
# INVALID-LLVM-TC2: error: '[[FILE]]': section header table goes past the end of the file: e_shoff = 0x1000
206+
# INVALID-GNU-TC2: error: '[[FILE]]': section header table goes past the end of the file: e_shoff = 0x1000
204207

205208
--- !ELF
206209
FileHeader:
@@ -222,14 +225,14 @@ Sections:
222225
## Check we don't dump anything except the file header when the section header table can't be read.
223226

224227
# RUN: not llvm-readobj -a %t.invalid1 2>&1 \
225-
# RUN: | FileCheck %s -DFILE=%t.invalid1 -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-LLVM
228+
# RUN: | FileCheck %s -DFILE=%t.invalid1 -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-LLVM-TC1
226229
# RUN: not llvm-readelf -a %t.invalid1 2>&1 \
227-
# RUN: | FileCheck %s -DFILE=%t.invalid1 -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-GNU
230+
# RUN: | FileCheck %s -DFILE=%t.invalid1 -DSECHDRCOUNT=8192 -DSECHDRSTRTABINDEX=12288 --check-prefix=INVALID-GNU-TC1
228231

229232
## Check what we print when e_shnum == 0, e_shstrndx == SHN_XINDEX and the section header table can't be read.
230233

231234
# RUN: yaml2obj %s -DSHNUM=0 -DSHSTRNDX=0xffff --docnum=4 -o %t.invalid2
232235
# RUN: not llvm-readobj --file-headers %t.invalid2 2>&1 \
233-
# RUN: | FileCheck %s -DFILE=%t.invalid2 -DSECHDRCOUNT="<?>" -DSECHDRSTRTABINDEX="<?>" --check-prefix=INVALID-LLVM
236+
# RUN: | FileCheck %s -DFILE=%t.invalid2 -DSECHDRCOUNT="<?>" -DSECHDRSTRTABINDEX="<?>" --check-prefix=INVALID-LLVM-TC2
234237
# RUN: not llvm-readelf --file-headers %t.invalid2 2>&1 \
235-
# RUN: | FileCheck %s -DFILE=%t.invalid2 -DSECHDRCOUNT="<?>" -DSECHDRSTRTABINDEX="<?>" --check-prefix=INVALID-GNU
238+
# RUN: | FileCheck %s -DFILE=%t.invalid2 -DSECHDRCOUNT="<?>" -DSECHDRSTRTABINDEX="<?>" --check-prefix=INVALID-GNU-TC2

0 commit comments

Comments
 (0)