Bug 226972

Summary: devel/libds: fails to link with lld as /usr/bin/ld
Product: Ports & Packages Reporter: Ed Maste <emaste>
Component: Individual Port(s)Assignee: freebsd-ports-bugs (Nobody) <ports-bugs>
Status: Closed FIXED    
Severity: Affects Only Me CC: w.schwarzenfeld
Priority: ---    
Version: Latest   
Hardware: Any   
OS: Any   
See Also: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=263533
Bug Depends on:    
Bug Blocks: 214864    

Description Ed Maste freebsd_committer freebsd_triage 2018-03-27 13:11:26 UTC
I'm working on switching to LLVM's lld linker as the FreeBSD system linker (/usr/bin/ld)[1], and the port in this PR is reported as a new failure in the exp-run, PR 214864.

An excerpt from the build log[2]:
---
ld: error: unable to find library -lc
---

Known issues in this port or in lld that affect this port:

(2) lld has no built-in search paths (/lib, /usr/lib). Normally the linker is invoked from the compiler driver, and the search paths are added by the compiler. If lld is invoked directly library search paths must be specified explicitly, with -L/lib -L/usr/lib.

FreeBSD 11 and later have lld available as /usr/bin/ld.lld, so one simple option for testing is to just symlink /usr/bin/ld to ld.lld (and restore it to ld.bfd).

A port Makefile knob, LLD_UNSAFE=yes, exists to indicate that a port does not work with lld, and requires either /usr/bin/ld.bfd or binutils from ports. This should work for the common case of ports written in C using GNU autoconf; it may have no effect on other ports.

[1] https://lists.freebsd.org/pipermail/freebsd-current/2018-March/068985.html
[2] http://package18.nyi.freebsd.org/data/headamd64PR214864-default/2018-03-21_17h43m11s/logs/errors/libds-1.0_1.log
Comment 1 commit-hook freebsd_committer freebsd_triage 2018-03-27 21:25:36 UTC
A commit references this bug:

Author: emaste
Date: Tue Mar 27 21:24:51 UTC 2018
New revision: 465760
URL: https://svnweb.freebsd.org/changeset/ports/465760

Log:
  devel/libds: use BINARY_ALIAS to ensure linker is ld.bfd

  lld has no built-in search paths (/lib, /usr/lib).  Normally the linker
  is invoked from the compiler driver, and the search paths are added by
  the compiler. If lld is invoked directly library search paths must be
  specified explicitly, with -L/lib -L/usr/lib.

  This port does not honour LD or -fuse-ld in CFLAGS via LLD_UNSAFE, but
  BINARY_ALIAS can be used to ensure we use the BFD linker.

  PR:		226972
  Approved by:	portmgr (LLD_UNSAFE blanket)
  Sponsored by:	The FreeBSD Foundation

Changes:
  head/devel/libds/Makefile
Comment 2 Ed Maste freebsd_committer freebsd_triage 2018-03-28 01:05:26 UTC
Followup, if BINARY_ALIAS is used it should be in addition to LLD_UNSAFE, so that architectures without a /usr/bin/ld.bfd (arm64) work. If possible LLD_UNSAFE=yes should imply BINARY_ALIAS=ld=ld.bfd, under discussion on the ports mailing list.
Comment 3 Walter Schwarzenfeld freebsd_triage 2018-03-28 02:34:39 UTC
Has stack-protector only from bsd.ssp.mk. Only need SSP_UNSAFE=yes.
Comment 4 Ed Maste freebsd_committer freebsd_triage 2018-03-28 02:44:45 UTC
(In reply to w.schwarzenfeld from comment #3)
The bsd.ssp.mk issue results in -fstack-protector being passed to the linker, which isn't the case here?
Comment 5 Ed Maste freebsd_committer freebsd_triage 2018-03-29 16:48:22 UTC
Workaround committed.