[llvm-objcopy] [COFF] Fix writing object files without symbols/string table

Previously, this was broken - by setting PointerToSymbolTable to zero
but still actually writing the string table length, the object file
header was corrupted.

Differential Revision: https://reviews.llvm.org/D56584

llvm-svn: 350926
This commit is contained in:
Martin Storsjo 2019-01-11 13:47:37 +00:00
parent eb4956cdb9
commit c1a1893d9d
3 changed files with 21 additions and 5 deletions

View File

@ -0,0 +1,11 @@
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .text
Characteristics: [ ]
Alignment: 4
SectionData: E800000000C3C3C3
symbols:
...

View File

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

View File

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