summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Object/COFFObjectFile.cpp8
-rw-r--r--llvm/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386bin0 -> 704 bytes
-rw-r--r--llvm/test/tools/llvm-readobj/coff-zero-string-table.test8
3 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp
index 41d21eed139..0c79506f419 100644
--- a/llvm/lib/Object/COFFObjectFile.cpp
+++ b/llvm/lib/Object/COFFObjectFile.cpp
@@ -409,9 +409,13 @@ error_code COFFObjectFile::initSymbolTablePtr() {
getObject(StringTable, Data, StringTableAddr, StringTableSize))
return EC;
+ // Treat table sizes < 4 as empty because contrary to the PECOFF spec, some
+ // tools like cvtres write a size of 0 for an empty table instead of 4.
+ if (StringTableSize < 4)
+ StringTableSize = 4;
+
// Check that the string table is null terminated if has any in it.
- if (StringTableSize < 4 ||
- (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0))
+ if (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0)
return object_error::parse_failed;
return object_error::success;
}
diff --git a/llvm/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386 b/llvm/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386
new file mode 100644
index 00000000000..f41f224f609
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/Inputs/zero-string-table.obj.coff-i386
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/coff-zero-string-table.test b/llvm/test/tools/llvm-readobj/coff-zero-string-table.test
new file mode 100644
index 00000000000..dfcf79e2477
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/coff-zero-string-table.test
@@ -0,0 +1,8 @@
+Ensure that we can read COFF objects with a string table size of 0 (instead
+of 4) for empty string tables.
+
+RUN: llvm-readobj -t %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s
+
+CHECK: Symbols [
+CHECK: Symbol {
+CHECK: Name: $R000000
OpenPOWER on IntegriCloud