diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -116,16 +116,18 @@ if (hasInputSections || typeIsSet) { if (typeIsSet || !canMergeToProgbits(type) || !canMergeToProgbits(isec->type)) { - // Changing the type of a (NOLOAD) section is fishy, but some projects - // (e.g. https://github.com/ClangBuiltLinux/linux/issues/1597) - // traditionally rely on the behavior. Issue a warning to not break - // them. Other types get an error. - auto diagnose = type == SHT_NOBITS ? warn : errorOrWarn; - diagnose("section type mismatch for " + isec->name + "\n>>> " + - toString(isec) + ": " + - getELFSectionTypeName(config->emachine, isec->type) + - "\n>>> output section " + name + ": " + - getELFSectionTypeName(config->emachine, type)); + // The (NOLOAD) changes the section type to SHT_NOBITS, the intention is + // that the contents at that address is provided by some other means. + // Some projects (e.g. + // https://github.com/ClangBuiltLinux/linux/issues/1597) rely on the + // behavior. Other types get an error. + if (type != SHT_NOBITS) { + errorOrWarn("section type mismatch for " + isec->name + "\n>>> " + + toString(isec) + ": " + + getELFSectionTypeName(config->emachine, isec->type) + + "\n>>> output section " + name + ": " + + getELFSectionTypeName(config->emachine, type)); + } } if (!typeIsSet) type = SHT_PROGBITS; diff --git a/lld/test/ELF/linkerscript/noload.s b/lld/test/ELF/linkerscript/noload.s --- a/lld/test/ELF/linkerscript/noload.s +++ b/lld/test/ELF/linkerscript/noload.s @@ -22,7 +22,7 @@ # RUN: ld.lld --script %t/lds %t.o %t/mismatch.o -o %t/out 2>&1 | FileCheck %s --check-prefix=WARN # RUN: llvm-readelf -S -l %t/out | FileCheck %s --check-prefix=CHECK2 -# WARN: warning: section type mismatch for .data_noload_a +# WARN-NOT: warning: section type mismatch for .data_noload_a # CHECK2: Name Type Address Off Size # CHECK2: .data_noload_a NOBITS 0000000000000000 [[OFF:[0-9a-f]+]] 001001