<div dir="ltr"><div>lld now implements almost all of the functionality necessary to function as a system linker for FreeBSD/amd64, and I've started investigating other CPU architectures that FreeBSD supports. Of course some of these are known to have limited support in lld, but I want to capture a snapshot of where things stand today.</div><div><br></div><div>sparc64 and riscv are excluded as they have no lld support. sparc64 is not of much interest in FreeBSD any longer (we support only long-obsolete CPUs), but we have a strong interest in linking FreeBSD/riscv with lld.</div><div><br></div><div>PRs or patches will follow after individual issues are diagnosed.<br></div><div><br></div><div>Per-arch status:</div><div><br></div><div>## amd64 (aka x86-64)</div><div>With WIP patches to both lld and FreeBSD it is possible to link a working base system kernel and userland.</div><div><br></div><div>The primary lld limitation relates to wildcards in extern "C++" blocks in version scripts. We also need to rework the way the FreeBSD boot components are built.</div><div><br></div><div>Known issues have PRs or patches in review. I hope that we'll soon start extensively testing the ports collection (the 25K third party software packages) using lld as the linker.</div><div><br></div><div>I posted an update, with a proposed set of steps for importing lld into FreeBSD, at <a href="https://lists.freebsd.org/pipermail/freebsd-toolchain/2016-August/002240.html">https://lists.freebsd.org/pipermail/freebsd-toolchain/2016-August/002240.html</a>.</div><div><br></div><div>## arm</div><div>Fails very early on in the build, while linking the target libc.so.7.</div><div><br></div><div><div>relocation R_ARM_REL32 cannot refer to absolute symbol _GLOBAL_OFFSET_TABLE_</div></div><div><div>can't create dynamic relocation R_ARM_GOTOFF32 against symbol _libc_arm_fpu_present</div></div><div><div>can't create dynamic relocation R_ARM_NONE against symbol __aeabi_unwind_cpp_pr0</div></div><div>...</div><div><br></div><div>## arm64</div><div>Userland link completes with the same set of WIP patches as above. Minimal testing has been done on the resulting binaries. The kernel link fails with thousands of "relocation R_AARCH64_ADR_PREL_PG_HI21 out of range" errors.</div><div><br></div><div><div>## i386<br></div></div><div>The userland link completes, along with the kernel itself; results untested. Kernel modules fail with:</div><div><br></div><div><div>can't create dynamic relocation R_386_32 against readonly segment               </div></div><div><div>can't create dynamic relocation R_386_PC32 against symbol device_get_parent     </div></div><div>...</div><div><br></div><div>## mips64<br></div><div>mips64 uses libstdc++ (not libc++) and the lack of version script wildcard support for symbols in extern "C++" blocks prevent building it with lld. Tracked in pr29093. After disabling C++ support much of the userland does link, but is untested.</div><div><br></div><div>Three base system binaries (and related variants of them) fail to build: gcc, gdb, and svn. The error is "<span style="font-size:12.8px">relocation </span><span style="font-size:12.8px">R_MIPS_GOT_DISP out of range". It's not too surprising as these binaries are expected to be among the larger ones in the base system, although they do successfully link with GNU ld. The k</span>ernel link fails wtih "duplicate symbol: _gp in (internal) and (internal)".</div><div><br></div><div><div>## mips</div><div>C++ is disabled as described above for mips64. One userland component (ubldr) failed to build due to a linker script error, to be investigated. The kernel link fails with "duplicate symbol: _gp in (internal) and (internal)".</div><div><br></div></div><div>## powerpc (32-bit)<br></div><div>Fails early, linking the target libc.so.7.<br></div><div><br></div><div>can't create dynamic relocation R_PPC_GOT16 against symbol .LANCHOR0<br>can't create dynamic relocation R_PPC_GOT16 against symbol __cxa_finalize<br>can't create dynamic relocation R_PPC_GOT16 against symbol __dso_handle<br>can't create dynamic relocation R_PPC_PLTREL24 against symbol __cxa_finalize<br>...<div><br></div><div>% sed -E -n "s/can't create dynamic relocation ([^ ]*).*$/\1/p" build.log | sort | uniq -c | sort -rn<br></div><div><div>17658 R_PPC_PLTREL24</div><div>9647 R_PPC_GOT16</div><div>3274 R_PPC_REL32</div><div> 231 R_PPC_GOT_TLSGD16</div><div> 101 R_PPC_LOCAL24PC</div><div><br></div><div>## powerpc64 (64-bit)</div><div>Fails early, linking the target libc.so.7.</div><div><br></div><div>can't create dynamic relocation R_PPC64_REL24 against readonly segment<br></div><div><div>can't create dynamic relocation R_PPC64_REL24 against readonly segment</div><div>can't create dynamic relocation R_PPC64_REL24 against symbol _collate_wxfrm    </div><div>can't create dynamic relocation R_PPC64_REL24 against symbol __get_locale      </div><div>can't create dynamic relocation R_PPC64_REL24 against symbol __get_locale      </div></div><div><div>...</div><div><br></div><div><div>% sed -E -n "s/can't create dynamic relocation ([^ ]*).*$/\1/p" build.log | sort | uniq -c | sort -rn<br></div></div><div>6899 R_PPC64_REL24</div><div>2902 R_PPC64_REL32</div><div>  27 R_PPC64_REL64</div></div></div><div><br></div></div></div>