Index: test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml =================================================================== --- /dev/null +++ test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml @@ -0,0 +1,21 @@ +## Check we do not crash/assert when .dynsym is specified +## explicitly, but .dynstr is not present. + +# RUN: yaml2obj %s -o %t +# RUN: not llvm-readelf --section-headers %t 2>&1 | FileCheck %s + +## TODO: Check that .dynsym has Link field set to 0. +## GNU readelf is able to dump sections headers, +## but llvm-readelf report an error below too early. + +# CHECK: error: invalid sh_type for string table, expected SHT_STRTAB + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .dynsym + Type: SHT_SYMTAB Index: tools/yaml2obj/yaml2elf.cpp =================================================================== --- tools/yaml2obj/yaml2elf.cpp +++ tools/yaml2obj/yaml2elf.cpp @@ -367,7 +367,17 @@ bool IsStatic = STType == SymtabType::Static; SHeader.sh_name = DotShStrtab.getOffset(IsStatic ? ".symtab" : ".dynsym"); SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM; - SHeader.sh_link = IsStatic ? SN2I.get(".strtab") : SN2I.get(".dynstr"); + + // When we describe the .dynsym section in document explicitly, it is allowed + // to omit "DynamicSymbols" tag. In this case, .dynstr is not added implicitly + // and we should be able to leave the Link zeroed if .dynstr is not described. + unsigned Link = 0; + if (IsStatic) + Link = SN2I.get(".strtab"); + else + SN2I.lookup(".dynstr", Link); + SHeader.sh_link = Link; + if (!IsStatic) SHeader.sh_flags |= ELF::SHF_ALLOC;