From 556af193309f6e283712602b9a8ca5d19adb1792 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 19 Dec 2022 11:53:02 +0000 Subject: [PATCH] [llvm-objcopy] Use getNumberOfSymbols() instead of getRawNumberOfSymbols() getRawNumberOfSymbols() assumes that a symbol table exists, which isn't always guaranteed, while getNumberOfSymbols() handles and tolerates objects without a symbol table. When there is a symbol table, both methods return the same value. Also add a test to ensure we don't regress in this regard. The test generates a basic COFF object with symbols and overrides the symbol table pointer with zeros to craft the input required to verify llvm-objcopy works as expected in this scenario. --- llvm/lib/ObjCopy/COFF/COFFReader.cpp | 4 ++-- .../llvm-objcopy/COFF/Inputs/no-symbol-table.yaml | 17 +++++++++++++++++ .../tools/llvm-objcopy/COFF/no-symbol-table.test | 20 ++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/llvm-objcopy/COFF/Inputs/no-symbol-table.yaml create mode 100644 llvm/test/tools/llvm-objcopy/COFF/no-symbol-table.test diff --git a/llvm/lib/ObjCopy/COFF/COFFReader.cpp b/llvm/lib/ObjCopy/COFF/COFFReader.cpp index 44bf303..32aceb8 100644 --- a/llvm/lib/ObjCopy/COFF/COFFReader.cpp +++ b/llvm/lib/ObjCopy/COFF/COFFReader.cpp @@ -83,9 +83,9 @@ Error COFFReader::readSections(Object &Obj) const { 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 index 0000000..364db51 --- /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 index 0000000..d558bf2 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/COFF/no-symbol-table.test @@ -0,0 +1,20 @@ +## 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 + +## Check that we report a single symbol before overriding the symbol table pointer. +# RUN: llvm-readobj --file-headers %t.obj | FileCheck %s --check-prefix=BEFORE +# BEFORE: SymbolCount: 1 + +## Override the symbol table pointer with zeros. +# RUN: %python -c "with open(r'%t.obj', 'r+b') as input: input.seek(8); input.write(b'\x00' * 4)" +# RUN: llvm-readobj --file-headers %t.obj | FileCheck %s --check-prefix=POINTER +# POINTER: PointerToSymbolTable: 0x0 + +## Make sure we can run llvm-objcopy on the resulting object. +# RUN: llvm-objcopy %t.obj + +## Check that the number of symbols is now reported as zero. +# RUN: llvm-readobj --file-headers %t.obj | FileCheck %s --check-prefix=COUNT +# COUNT: SymbolCount: 0 \ No newline at end of file -- 2.7.4