diff --git a/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml b/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml new file mode 100644 index 00000000000..16c4a6a2d28 --- /dev/null +++ b/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml @@ -0,0 +1,22 @@ +## 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 reports an error below too early. +## See https://bugs.llvm.org/show_bug.cgi?id=42215. + +# 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 diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index be484783534..8a53a1b2f48 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -367,7 +367,18 @@ void ELFState::initSymtabSectionHeader(Elf_Shdr &SHeader, 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 the document explicitly, it is + // allowed to omit the "DynamicSymbols" tag. In this case .dynstr is not added + // implicitly and we should be able to leave the Link zeroed if .dynstr is not + // defined. + 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;