Index: test/tools/yaml2obj/elf-comdat-broken.yaml =================================================================== --- test/tools/yaml2obj/elf-comdat-broken.yaml +++ test/tools/yaml2obj/elf-comdat-broken.yaml @@ -0,0 +1,34 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj -sections -elf-section-groups %t | FileCheck %s ff + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + Info: foo + Members: + - SectionOrType: 0xFF + - SectionOrType: 0x3 +Symbols: + Global: + - Name: foo + +## Check we are able to produce SHT_GROUP section with a custom Type (0xFF). +# CHECK: Groups { +# CHECK-NEXT: Group { +# CHECK-NEXT: Name: .group +# CHECK-NEXT: Index: 1 +# CHECK-NEXT: Link: 2 +# CHECK-NEXT: Info: 1 +# CHECK-NEXT: Type: COMDAT (0xFF) +# CHECK-NEXT: Signature: foo +# CHECK-NEXT: Section(s) in group [ +# CHECK-NEXT: .strtab (3) +# CHECK-NEXT: ] +# CHECK-NEXT: } Index: tools/yaml2obj/yaml2elf.cpp =================================================================== --- tools/yaml2obj/yaml2elf.cpp +++ tools/yaml2obj/yaml2elf.cpp @@ -538,10 +538,16 @@ if (member.sectionNameOrType == "GRP_COMDAT") sectionIndex = llvm::ELF::GRP_COMDAT; else if (SN2I.lookup(member.sectionNameOrType, sectionIndex)) { - WithColor::error() << "Unknown section referenced: '" - << member.sectionNameOrType << "' at YAML section' " - << Section.Name << "\n"; - return false; + // We did not find the section and are about to report an error. + // As a last resort, try to parse as a hex value. + // This is useful for crafting invalid objects. + if (!member.sectionNameOrType.startswith("0x") || + !to_integer(member.sectionNameOrType, sectionIndex)) { + WithColor::error() << "Unknown section referenced: '" + << member.sectionNameOrType << "' at YAML section' " + << Section.Name << "\n"; + return false; + } } SIdx = sectionIndex; OS.write((const char *)&SIdx, sizeof(SIdx));