diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -446,6 +446,10 @@ if (sec.sh_size == 0) return false; + uint64_t flags = sec.sh_flags; + if (!(flags & SHF_MERGE)) + return false; + // Check for sh_entsize. The ELF spec is not clear about the zero // sh_entsize. It says that "the member [sh_entsize] contains 0 if // the section does not hold a table of fixed-size entries". We know @@ -459,9 +463,6 @@ 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) 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,15 @@ +## Ignore invalid sh_entsize (sh_size%sh_entsize!=0) for non-SHF_MERGE sections. +# 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