This is a self-contained testcase for an ld64
bug with symbol aliases;
it is a reduced testcase for problems we observed in Firefox.
The aliases.ll
file contains LLVM assembly. You may need to tweak the
target of aliases.ll
to make the LTO link, below, work
properly. main.c
has calls to all the of the functions contained in
aliases.ll
.
run.sh
compiles the appropriate files, links with -flto=thin
, and
runs the testcase. The expected output is:
f1: 5
f2: 5
g: 42
The output on my machine, using an ld64
with the bug, is:
f1: 5
f2: 18
g: 42
YMMV. The core problem can be seen from looking at the symbol table of the testcase:
jubilee:linker-bug froydnj$ nm testcase
0000000100000000 T __mh_execute_header
0000000100000f60 T _f1
0000000100000f70 t _f2
0000000100000f70 t _g
0000000100000f20 T _main
U _printf
U dyld_stub_binder
We would expect that _f1
and _f2
have identical addresses, given the
aliases.ll
file. The actual result is that _f2
and _g
have
identical addresses, with predictably bad results when those functions
are actually used.