Index: lib/MC/StringTableBuilder.cpp =================================================================== --- lib/MC/StringTableBuilder.cpp +++ lib/MC/StringTableBuilder.cpp @@ -159,6 +159,13 @@ if (K == MachO) Size = alignTo(Size, 4); // Pad to multiple of 4. + + // The first byte in an ELF string table must be null, according to the ELF + // specification. In 'initSize()' we reserved the first byte to hold null for + // this purpose and here we actually add the string to allow 'getOffset()' to + // be called on an empty string. + if (K == ELF) + StringIndexMap[CachedHashStringRef("")] = 0; } void StringTableBuilder::clear() { Index: test/tools/llvm-objcopy/ELF/symbol-empty-name.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/ELF/symbol-empty-name.test @@ -0,0 +1,47 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -t %t2 | FileCheck %s + +## Check that all values of the null 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: } + +## Check we emit a zero in st_name field when a symbol has no name. + +# CHECK: Name: .text (0) +# CHECK-NEXT: Value: 0x0 +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Binding: Local (0x0) +# CHECK-NEXT: Type: Section (0x3) +# CHECK-NEXT: Other: 0 +# CHECK-NEXT: Section: .text (0x1) +# CHECK-NEXT: } + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] +Symbols: + Local: + - Name: "" + Type: STT_SECTION + Section: .text + Global: + # We need to have a named symbol, otherwise the original + # issue that was fixed is not reproduced by this test. + - Name: foo