summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Object/ArchiveWriter.cpp5
-rw-r--r--llvm/test/Object/Inputs/solaris-nosymbols.yaml7
-rw-r--r--llvm/test/Object/archive-format.test12
3 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp
index 83fbf2f5854..d5ff2dbf7be 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -341,6 +341,11 @@ writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind,
if (isBSDLike(Kind))
print32(Out, Kind, StringTable.size()); // byte count of the string table
Out << StringTable;
+ // If there are no symbols, emit an empty symbol table, to satisfy Solaris
+ // tools, older versions of which expect a symbol table in a non-empty
+ // archive, regardless of whether there are any symbols in it.
+ if (StringTable.size() == 0)
+ print32(Out, Kind, 0);
// ld64 requires the next member header to start at an offset that is
// 4 bytes aligned.
diff --git a/llvm/test/Object/Inputs/solaris-nosymbols.yaml b/llvm/test/Object/Inputs/solaris-nosymbols.yaml
new file mode 100644
index 00000000000..85dabedcf9a
--- /dev/null
+++ b/llvm/test/Object/Inputs/solaris-nosymbols.yaml
@@ -0,0 +1,7 @@
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+...
diff --git a/llvm/test/Object/archive-format.test b/llvm/test/Object/archive-format.test
index f895a36bce3..219fc7f894a 100644
--- a/llvm/test/Object/archive-format.test
+++ b/llvm/test/Object/archive-format.test
@@ -78,3 +78,15 @@ THIN-PATH-NEXT: /65 0 0 0 644 4 `
RUN: not llvm-ar --format=bsd rcT bad.a 0123456789abcde 0123456789abcdef 2>&1 | FileCheck --check-prefix=BSD-THIN %s
BSD-THIN: Only the gnu format has a thin mode.
+
+If an archive has an object with no symbols, the linker and some other
+tools on some versions of Solaris will abort operations if there is no
+symbol table. Create such an object, put it into an archive, and check to
+see that there is an empty symbol table.
+RUN: mkdir -p %t
+RUN: yaml2obj %S/Inputs/solaris-nosymbols.yaml > %t/foo.o
+RUN: llvm-ar rs %t/foo.a %t/foo.o
+RUN: cat -v %t/foo.a | FileCheck -strict-whitespace --check-prefix=SOLARIS %s
+SOLARIS: !<arch>
+SOLARIS-NEXT: / 0 0 0 0 8 `
+SOLARIS-NEXT: ^@^@^@^@^@^@^@^@foo.o/
OpenPOWER on IntegriCloud