diff --git a/llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbols.yaml b/llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbols.yaml new file mode 100644 index 0000000000000000000000000000000000000000..db8aeb63d5eb550b2f11e11de01c53f32726683b --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbols.yaml @@ -0,0 +1,11 @@ +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ ] + Alignment: 4 + SectionData: E800000000C3C3C3 +symbols: +... diff --git a/llvm/test/tools/llvm-objcopy/COFF/basic-copy.test b/llvm/test/tools/llvm-objcopy/COFF/basic-copy.test index ddd12dcaf2fb8f3d702bfdedd14a76eb06b6df9c..ecdf430faf19ace4a1b4583b4489fd4e94d136a1 100644 --- a/llvm/test/tools/llvm-objcopy/COFF/basic-copy.test +++ b/llvm/test/tools/llvm-objcopy/COFF/basic-copy.test @@ -40,3 +40,9 @@ RUN: llvm-objcopy %t.x86_64.exe %t.x86_64-copy.exe RUN: obj2yaml %t.x86_64.exe > %t.x86_64.exe.yaml RUN: obj2yaml %t.x86_64-copy.exe > %t.x86_64-copy.exe.yaml RUN: cmp %t.x86_64.exe.yaml %t.x86_64-copy.exe.yaml + +RUN: yaml2obj %p/Inputs/no-symbols.yaml > %t.no-symbols.o +RUN: llvm-objcopy %t.no-symbols.o %t.no-symbols-copy.o +RUN: obj2yaml %t.no-symbols.o > %t.no-symbols.o.yaml +RUN: obj2yaml %t.no-symbols-copy.o > %t.no-symbols-copy.o.yaml +RUN: cmp %t.no-symbols.o.yaml %t.no-symbols-copy.o.yaml diff --git a/llvm/tools/llvm-objcopy/COFF/Writer.cpp b/llvm/tools/llvm-objcopy/COFF/Writer.cpp index d7a5224b5ef61b4eeb7c72a96d9f8ac2df3e0ecc..213cb11b788491a9039edfbdc849aa8627278eca 100644 --- a/llvm/tools/llvm-objcopy/COFF/Writer.cpp +++ b/llvm/tools/llvm-objcopy/COFF/Writer.cpp @@ -154,12 +154,11 @@ Error COFFWriter::finalize(bool IsBigObj) { size_t PointerToSymbolTable = FileSize; // StrTabSize <= 4 is the size of an empty string table, only consisting // of the length field. - if (SymTabSize == 0 && StrTabSize <= 4) { - // Don't point to the symbol table if empty. + if (SymTabSize == 0 && StrTabSize <= 4 && Obj.IsPE) { + // For executables, don't point to the symbol table and skip writing + // the length field, if both the symbol and string tables are empty. PointerToSymbolTable = 0; - // For executables, skip the length field of an empty string table. - if (Obj.IsPE) - StrTabSize = 0; + StrTabSize = 0; } size_t NumRawSymbols = SymTabSize / SymbolSize;