diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -563,7 +563,7 @@ !SectionHeaders.Sections); size_t FirstExcluded = SectionHeaders.Sections ? SectionHeaders.Sections->size() : 0; - if (Index >= FirstExcluded) { + if (Index > FirstExcluded) { if (LocSym.empty()) reportError("unable to link '" + LocSec + "' to excluded section '" + S + "'"); diff --git a/llvm/test/tools/yaml2obj/ELF/section-headers.yaml b/llvm/test/tools/yaml2obj/ELF/section-headers.yaml --- a/llvm/test/tools/yaml2obj/ELF/section-headers.yaml +++ b/llvm/test/tools/yaml2obj/ELF/section-headers.yaml @@ -418,3 +418,39 @@ Sections: - Name: .strtab - Name: .shstrtab + +## Show that we can reference both the first and last section in the section +## header table, via sh_link. + +# RUN: yaml2obj %s --docnum=14 -o %t14 +# RUN: llvm-readelf --sections %t14 | FileCheck %s --check-prefix=LINK + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL +Sections: + - Name: .strtab + Type: SHT_STRTAB + - Type: SectionHeaderTable + Sections: + - Name: .strtab + - Name: .ref.first + - Name: .ref.last + - Name: .shstrtab + - Name: .ref.first + Type: SHT_PROGBITS + Link: .strtab + - Name: .ref.last + Type: SHT_PROGBITS + Link: .shstrtab + - Name: .shstrtab + Type: SHT_STRTAB + +# LINK: There are 5 section headers +# LINK: [Nr] Name Type Address Off Size ES Flg Lk +# LINK: [ 1] .strtab +# LINK-NEXT: [ 2] .ref.first PROGBITS [[#%x,]] [[#%x,]] [[#%x,]] [[#%x,]] 1 +# LINK-NEXT: [ 3] .ref.last PROGBITS [[#%x,]] [[#%x,]] [[#%x,]] [[#%x,]] 4 +# LINK-NEXT: [ 4] .shstrtab