diff --git a/llvm/lib/ObjCopy/COFF/COFFReader.cpp b/llvm/lib/ObjCopy/COFF/COFFReader.cpp --- a/llvm/lib/ObjCopy/COFF/COFFReader.cpp +++ b/llvm/lib/ObjCopy/COFF/COFFReader.cpp @@ -83,9 +83,9 @@ Error COFFReader::readSymbols(Object &Obj, bool IsBigObj) const { std::vector Symbols; - Symbols.reserve(COFFObj.getRawNumberOfSymbols()); + Symbols.reserve(COFFObj.getNumberOfSymbols()); ArrayRef
Sections = Obj.getSections(); - for (uint32_t I = 0, E = COFFObj.getRawNumberOfSymbols(); I < E;) { + for (uint32_t I = 0, E = COFFObj.getNumberOfSymbols(); I < E;) { Expected SymOrErr = COFFObj.getSymbol(I); if (!SymOrErr) return SymOrErr.takeError(); diff --git a/llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbol-table.yaml b/llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbol-table.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbol-table.yaml @@ -0,0 +1,17 @@ +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [] +# We define a symbol here and override the symbol table pointer in the test to +# get an object with symbols but without a symbol table. +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC +... diff --git a/llvm/test/tools/llvm-objcopy/COFF/no-symbol-table.test b/llvm/test/tools/llvm-objcopy/COFF/no-symbol-table.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/COFF/no-symbol-table.test @@ -0,0 +1,9 @@ +## Test that llvm-objcopy can read a COFF object with symbols but without a +## symbol table. + +# RUN: yaml2obj %p/Inputs/no-symbol-table.yaml -o %t.obj + +## Override the symbol table pointer with zeros. +# RUN: %python -c "with open('%t.obj', 'r+b') as input: input.seek(8); input.write(b'\x00' * 4)" + +# RUN: llvm-objcopy %t.obj