Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -431,8 +431,15 @@ if (Sec.sh_link >= this->Sections.size()) fatal(toString(this) + ": invalid sh_link index: " + Twine(Sec.sh_link)); - this->Sections[Sec.sh_link]->DependentSections.push_back( - cast(this->Sections[I])); + + InputSectionBase *LinkSec = this->Sections[Sec.sh_link]; + InputSection *IS = cast(this->Sections[I]); + LinkSec->DependentSections.push_back(IS); + if (!isa(LinkSec)) + error("a section " + IS->Name + + " with SHF_LINK_ORDER should not refer a non-regular " + "section: " + + toString(LinkSec)); } } } Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -206,15 +206,9 @@ } InputSection *InputSectionBase::getLinkOrderDep() const { - if ((Flags & SHF_LINK_ORDER) && Link != 0) { - InputSectionBase *L = File->getSections()[Link]; - if (auto *IS = dyn_cast(L)) - return IS; - error("a section with SHF_LINK_ORDER should not refer a non-regular " - "section: " + - toString(L)); - } - return nullptr; + assert(Link); + assert(Flags & SHF_LINK_ORDER); + return cast(File->getSections()[Link]); } // Returns a source location string. Used to construct an error message. Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -98,7 +98,8 @@ Flags = IS->Flags; } else { // Otherwise, check if new type or flags are compatible with existing ones. - if ((Flags & (SHF_ALLOC | SHF_TLS)) != (IS->Flags & (SHF_ALLOC | SHF_TLS))) + unsigned Mask = SHF_ALLOC | SHF_TLS | SHF_LINK_ORDER; + if ((Flags & Mask) != (IS->Flags & Mask)) error("incompatible section flags for " + Name + "\n>>> " + toString(IS) + ": 0x" + utohexstr(IS->Flags) + "\n>>> output section " + Name + ": 0x" + utohexstr(Flags)); Index: test/ELF/section-metadata-err.s =================================================================== --- test/ELF/section-metadata-err.s +++ test/ELF/section-metadata-err.s @@ -3,7 +3,7 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s -# CHECK: error: a section with SHF_LINK_ORDER should not refer a non-regular section: {{.*}}section-metadata-err.s.tmp.o:(.foo) +# CHECK: error: a section .bar with SHF_LINK_ORDER should not refer a non-regular section: {{.*}}section-metadata-err.s.tmp.o:(.foo) .global _start _start: @@ -12,4 +12,4 @@ .section .foo,"aM",@progbits,8 .quad 0 -.section bar,"ao",@progbits,.foo +.section .bar,"ao",@progbits,.foo Index: test/ELF/section-metadata-err2.s =================================================================== --- test/ELF/section-metadata-err2.s +++ test/ELF/section-metadata-err2.s @@ -0,0 +1,17 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s + +## Check we do not crash and report proper errors. +# CHECK: error: a section .bar with SHF_LINK_ORDER should not refer a non-regular section: {{.*}}section-metadata-err2.s.tmp.o:(.foo) +# CHECK: error: a section .bar with SHF_LINK_ORDER should not refer a non-regular section: {{.*}}section-metadata-err2.s.tmp.o:(.foo) + +.section .foo,"aM",@progbits,8 +.quad 0 + +.section .bar,"ao",@progbits,.foo,unique,1 +.quad 0 + +.section .bar,"ao",@progbits,.foo,unique,2 +.quad 1 Index: test/ELF/section-metadata-err3.s =================================================================== --- test/ELF/section-metadata-err3.s +++ test/ELF/section-metadata-err3.s @@ -0,0 +1,17 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s + +# CHECK: error: incompatible section flags for .bar +# CHECK-NEXT: >>> {{.*}}section-metadata-err3.s.tmp.o:(.bar): 0x2 +# CHECK-NEXT: >>> output section .bar: 0x82 + +.section .foo,"a",@progbits +.quad 0 + +.section .bar,"ao",@progbits,.foo,unique,1 +.quad 0 + +.section .bar,"a",@progbits,unique,2 +.quad 1