diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -424,6 +424,9 @@ template bool ObjFile::shouldMerge(const Elf_Shdr &sec, StringRef name) { + if (!(sec.sh_flags & SHF_MERGE)) + return false; + // On a regular link we don't merge sections if -O0 (default is -O1). This // sometimes makes the linker significantly faster, although the output will // be bigger. @@ -459,10 +462,7 @@ Twine(sec.sh_size) + ") must be a multiple of sh_entsize (" + Twine(entSize) + ")"); - uint64_t flags = sec.sh_flags; - if (!(flags & SHF_MERGE)) - return false; - if (flags & SHF_WRITE) + if (sec.sh_flags & SHF_WRITE) fatal(toString(this) + ":(" + name + "): writable SHF_MERGE section is not supported"); diff --git a/lld/test/ELF/invalid/entsize.yaml b/lld/test/ELF/invalid/entsize.yaml new file mode 100644 --- /dev/null +++ b/lld/test/ELF/invalid/entsize.yaml @@ -0,0 +1,17 @@ +## Ignore invalid sh_entsize (sh_size%sh_entsize!=0) for non-SHF_MERGE sections. +## GNU as before 2.35 had such a bug for .stab +## https://sourceware.org/bugzilla/show_bug.cgi?id=25768 +# RUN: yaml2obj %s -o %t.o +# RUN: ld.lld -e 0 --fatal-warnings %t.o -o /dev/null + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .stab + Type: SHT_PROGBITS + EntSize: 20 + Size: 24