1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[yaml2obj] - Do not assert when .dynsym is specified explicitly, but .dynstr is not present.

We have a code in buildSectionIndex() that adds implicit sections:

// Add special sections after input sections, if necessary.
for (StringRef Name : implicitSectionNames())
  if (SN2I.addName(Name, SecNo)) {
    // Account for this section, since it wasn't in the Doc
    ++SecNo;
    DotShStrtab.add(Name);
  }

The problem arises when .dynsym is specified explicitly and no
DynamicSymbols is used. In that case, we do not add
.dynstr implicitly and will assert later when will try to set Link
for .dynsym.

Seems, in this case, reasonable behavior is to allow Link field to be zero.
This is what this patch does.

Differential revision: https://reviews.llvm.org/D63001

llvm-svn: 362929
This commit is contained in:
George Rimar 2019-06-10 11:38:06 +00:00
parent 8d09c211fb
commit a46ae2d5c4
2 changed files with 34 additions and 1 deletions

View File

@ -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

View File

@ -367,7 +367,18 @@ void ELFState<ELFT>::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;