Index: test/tools/llvm-objcopy/ELF/symtab-null-entry.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/ELF/symtab-null-entry.test @@ -0,0 +1,28 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -t %t2 | FileCheck %s + +## Check that all values of the first symbol are zeroes. + +# CHECK: Symbols [ +# CHECK-NEXT: Symbol { +# CHECK-NEXT: Name: (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: None (0x0) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: Undefined (0x0) +# CHECK-NEXT: } + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Symbols: + Global: + # We need to have a symbol, otherwise the original + # issue that was fixed did not reproduce. + - Name: foo Index: tools/llvm-objcopy/ELF/Object.cpp =================================================================== --- tools/llvm-objcopy/ELF/Object.cpp +++ tools/llvm-objcopy/ELF/Object.cpp @@ -297,7 +297,10 @@ Visitor.visit(*this); } -void StringTableSection::addString(StringRef Name) { StrTabBuilder.add(Name); } +void StringTableSection::addString(StringRef Name) { + assert(!Name.empty()); + StrTabBuilder.add(Name); +} uint32_t StringTableSection::findIndex(StringRef Name) const { return StrTabBuilder.getOffset(Name); @@ -470,7 +473,7 @@ void SymbolTableSection::finalize() { uint32_t MaxLocalIndex = 0; for (auto &Sym : Symbols) { - Sym->NameIndex = SymbolNames->findIndex(Sym->Name); + Sym->NameIndex = Sym->Name.empty() ? 0 : SymbolNames->findIndex(Sym->Name); if (Sym->Binding == STB_LOCAL) MaxLocalIndex = std::max(MaxLocalIndex, Sym->Index); } @@ -492,8 +495,11 @@ } // Add all of our strings to SymbolNames so that SymbolNames has the right // size before layout is decided. + // Ignore the symbols with empty names, e.g special first symbol entry, + // some sections symbols etc. for (auto &Sym : Symbols) - SymbolNames->addString(Sym->Name); + if (!Sym->Name.empty()) + SymbolNames->addString(Sym->Name); } const Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) const {