Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 4a35bb0

Browse files
author
Danek Duvall
committed
Archives require a symbol table on Solaris, even if empty.
On Solaris ld (and some other tools that use the underlying utility libraries, such as elfdump) chokes on an archive library that has no symbol table. The Solaris tools always create one, even if it's empty. That bug has been fixed in the latest development line, and can probably be backported to a supported release, but it would be nice if LLVM's archiver could emit the empty symbol table, too. Fixed in upstream LLVM in revision 297773.
1 parent 859fb26 commit 4a35bb0

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

lib/Object/ArchiveWriter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,11 @@ writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind,
294294
if (Kind == object::Archive::K_BSD)
295295
print32(Out, Kind, StringTable.size()); // byte count of the string table
296296
Out << StringTable;
297+
// If there are no symbols, emit an empty symbol table, to satisfy Solaris
298+
// tools, older versions of which expect a symbol table in a non-empty
299+
// archive, regardless of whether there are any symbols in it.
300+
if (StringTable.size() == 0)
301+
print32(Out, Kind, 0);
297302

298303
// ld64 requires the next member header to start at an offset that is
299304
// 4 bytes aligned.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
--- !ELF
2+
FileHeader:
3+
Class: ELFCLASS64
4+
Data: ELFDATA2LSB
5+
Type: ET_REL
6+
Machine: EM_X86_64
7+
...

test/Object/archive-format.test

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,15 @@ THIN-PATH-NEXT: /65 0 0 0 644 4 `
6565

6666
RUN: not llvm-ar --format=bsd rcT bad.a 0123456789abcde 0123456789abcdef 2>&1 | FileCheck --check-prefix=BSD-THIN %s
6767
BSD-THIN: Only the gnu format has a thin mode.
68+
69+
If an archive has an object with no symbols, the linker and some other
70+
tools on some versions of Solaris will abort operations if there is no
71+
symbol table. Create such an object, put it into an archive, and check to
72+
see that there is an empty symbol table.
73+
RUN: mkdir -p %t
74+
RUN: yaml2obj %S/Inputs/solaris-nosymbols.yaml > %t/foo.o
75+
RUN: llvm-ar rs %t/foo.a %t/foo.o
76+
RUN: cat -v %t/foo.a | FileCheck -strict-whitespace --check-prefix=SOLARIS %s
77+
SOLARIS: !<arch>
78+
SOLARIS-NEXT: / 0 0 0 0 8 `
79+
SOLARIS-NEXT: ^@^@^@^@^@^@^@^@foo.o/

0 commit comments

Comments
 (0)