<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Nov 18, 2015 at 12:06 PM, Ed Maste via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I've been occasionally trying to build the FreeBSD base system (on<br>
amd64 / x86_64) using lld in order to see how things are progressing.<br>
With a few hacks in the FreeBSD build I can now link the base system<br>
userland.<br>
<br>
The missing functionality I had to work around is listed below. Some<br>
of these should probably be addressed in our FreeBSD build<br>
infrastructure, while others should be handled in lld. I'm listing<br>
this here only as a snapshot of where lld stands today for our use.<br>
<br>
1. -r / --relocatable (PR 23024)<br>
There are four or five uses of -r in the FreeBSD base system, and at<br>
least some of them cannot be handled by just using ar instead.<br>
<br>
2. -E / --export-dynamic<br>
This is used by our GDB build.<br>
<br>
3. -Y [path]<br>
Used by the 32-bit compat libraries. GNU ld documents this as "add<br>
path to the default library search path." I don't understand exactly<br>
what this option does, versus -L.<br>
<br>
4. unrecognized reloc 22 (R_X86_64_GOTTPOFF)<br>
Encountered in one of the libc tests.<br>
<br>
5. --no-undefined vs _GLOBAL_OFFSET_TABLE_<br>
A number of libraries are linked with --no-undefined. These fail wtih<br>
an error of the form:<br>
undefined symbol: _GLOBAL_OFFSET_TABLE_ in /<path>tmp/usr/lib/crtbeginS.o<br>
<br>
6. emulation type "elf_i386_fbsd"<br>
This is used by the 32-bit library build, which fails with "Unknown<br>
emulation: elf_i386_fbsd"<br></blockquote><div><br></div><div>gold doesn't recognize that emulation name. Maybe you want to use elf_i386 instead?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
7. static linking fails because _end is undefined (PR 25528)<br>
<br>
8. Library search paths<br>
The FreeBSD build infrastructure builds the toolchain twice: once for<br>
the build host to build the target FreeBSD libraries and binaries, and<br>
once for installation as the toolchain installed in the target. The<br>
host toolchain is built with a set of baked-in library search paths<br>
(.../tmp/lib and .../tmp/usr/lib).<br>
<br>
I have a WIP patch to always apply --sysroot during the FreeBSD build,<br>
but with this added it seems we do not get $SYSROOT/lib and<br>
$SYSROOT/usr/lib as default search paths in lld. We also lack a<br>
convenient way to debug this today in lld; with GNU ld the --verbose<br>
option dumps a built-in linker script which includes the paths in use,<br>
but lld does not have something equivalent.</blockquote><div><br></div><div>Feel free to add that functionality. We have --verbose flag already, but it prints out little information.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Also, the kernel link fails because FreeBSD's kernel linker script is<br>
too complicated for the current parser.<br>
<br>
<br>
For reference, here are the workarounds I applied to build FreeBSD<br>
userland with lld:<br>
<br>
* Remove -Wl,--no-undefined from those library makefiles where it is set<br>
* Disconnect lib/libpam/statc_modules from the build<br>
* Disable the addition of -static in <a href="http://bsd.lib.mk" rel="noreferrer" target="_blank">bsd.lib.mk</a><br>
* Explicitly add the temporary build paths as -L options in various LDFLAGS<br>
* Set the following options in src.conf:<br>
WITHOUT_BOOT=yes<br>
WITHOUT_RESCUE=yes<br>
WITHOUT_LIB32=yes<br>
WITHOUT_GDB=yes<br>
WITHOUT_TESTS=yes<br>
MODULES_OVERRIDE=<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br></div></div>