Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -573,7 +573,7 @@ this->sectionStringTable = CHECK(obj.getSectionStringTable(objSections), this); - for (size_t i = 0, e = objSections.size(); i < e; i++) { + for (size_t i = 0, e = objSections.size(); i < e; ++i) { if (this->sections[i] == &InputSection::discarded) continue; const Elf_Shdr &sec = objSections[i]; @@ -652,25 +652,29 @@ default: this->sections[i] = createInputSection(sec); } + } + + for (size_t i = 0, e = objSections.size(); i < e; ++i) { + if (this->sections[i] == &InputSection::discarded) + continue; + const Elf_Shdr &sec = objSections[i]; + if (!(sec.sh_flags & SHF_LINK_ORDER)) + continue; // .ARM.exidx sections have a reverse dependency on the InputSection they // have a SHF_LINK_ORDER dependency, this is identified by the sh_link. - if (sec.sh_flags & SHF_LINK_ORDER) { - InputSectionBase *linkSec = nullptr; - if (sec.sh_link < this->sections.size()) - linkSec = this->sections[sec.sh_link]; - if (!linkSec) - fatal(toString(this) + - ": invalid sh_link index: " + Twine(sec.sh_link)); - - InputSection *isec = cast(this->sections[i]); - linkSec->dependentSections.push_back(isec); - if (!isa(linkSec)) - error("a section " + isec->name + - " with SHF_LINK_ORDER should not refer a non-regular " - "section: " + - toString(linkSec)); - } + InputSectionBase *linkSec = nullptr; + if (sec.sh_link < this->sections.size()) + linkSec = this->sections[sec.sh_link]; + if (!linkSec) + fatal(toString(this) + ": invalid sh_link index: " + Twine(sec.sh_link)); + + InputSection *isec = cast(this->sections[i]); + linkSec->dependentSections.push_back(isec); + if (!isa(linkSec)) + error("a section " + isec->name + + " with SHF_LINK_ORDER should not refer a non-regular section: " + + toString(linkSec)); } } Index: lld/trunk/test/ELF/linkorder-forward-ref.test =================================================================== --- lld/trunk/test/ELF/linkorder-forward-ref.test +++ lld/trunk/test/ELF/linkorder-forward-ref.test @@ -0,0 +1,23 @@ +# REQUIRES: x86 +# RUN: yaml2obj %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readelf -S %t | FileCheck %s + +## Test that we accept forward sh_link references. + +# CHECK: .linkorder +# CHECK: .text + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .linkorder + Type: SHT_PROGBITS + Flags: [ SHF_LINK_ORDER ] + Link: 2 + - Name: .text + Type: SHT_PROGBITS