Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 13 Dec 2020 11:21:47 -0800
From:      Ryan Libby <rlibby@freebsd.org>
To:        Alex Richardson <arichardson@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all <svn-src-all@freebsd.org>,  svn-src-head <svn-src-head@freebsd.org>, Brooks Davis <brooks@freebsd.org>,  Ed Maste <emaste@freebsd.org>
Subject:   Re: svn commit: r364761 - in head: share/mk sys/conf sys/modules/cloudabi32 sys/modules/cloudabi64 sys/modules/linux sys/modules/linux64
Message-ID:  <CAHgpiFwsv_9Zmw4CmFCd4FuYS8AaRB7pnF8K0Oiv824zE1vp4A@mail.gmail.com>
In-Reply-To: <202008251330.07PDU4WQ055570@repo.freebsd.org>
References:  <202008251330.07PDU4WQ055570@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Aug 25, 2020 at 6:30 AM Alex Richardson <arichardson@freebsd.org> wrote:
>
> Author: arichardson
> Date: Tue Aug 25 13:30:03 2020
> New Revision: 364761
> URL: https://svnweb.freebsd.org/changeset/base/364761
>
> Log:
>   Pass -fuse-ld=/path/to/ld if ${LD} != "ld"
>
>   This is needed so that setting LD/XLD is not ignored when linking with $CC
>   instead of directly using $LD. Currently only clang accepts an absolute
>   path for -fuse-ld= (Clang 12+ will add a new --ld-path flag), so we now
>   warn when building with GCC and $LD != "ld" since that might result in the
>   wrong linker being used.
>
>   We have been setting XLD=/path/to/cheri/ld.lld in CheriBSD for a long time and
>   used a similar version of this patch to avoid linking with /usr/bin/ld.
>   This change is also required when building FreeBSD on an Ubuntu with Clang:
>   In that case we set XCC=/usr/lib/llvm-10/bin/clang and since
>   /usr/lib/llvm-10/bin/ does not contain a "ld" binary the build fails with
>   `clang: error: unable to execute command: Executable "ld" doesn't exist!`
>   unless we pass -fuse-ld=/usr/lib/llvm-10/bin/ld.lld.
>
>   This change passes -fuse-ld instead of copying ${XLD} to WOLRDTMP/bin/ld
>   since then we would have to ensure that this file does not exist while
>   building the bootstrap tools. The cross-linker might not be compatible with
>   the host linker (e.g. when building on macos: host-linker= Mach-O /usr/bin/ld,
>   cross-linker=LLVM ld.lld).
>
>   Reviewed By:  brooks, emaste
>   Differential Revision: https://reviews.freebsd.org/D26055
>
> Modified:
>   head/share/mk/bsd.sys.mk
>   head/sys/conf/kern.mk
>   head/sys/conf/kern.post.mk
>   head/sys/modules/cloudabi32/Makefile
>   head/sys/modules/cloudabi64/Makefile
>   head/sys/modules/linux/Makefile
>   head/sys/modules/linux64/Makefile
>
> Modified: head/share/mk/bsd.sys.mk
> ==============================================================================
> --- head/share/mk/bsd.sys.mk    Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/share/mk/bsd.sys.mk    Tue Aug 25 13:30:03 2020        (r364761)
> @@ -284,6 +284,19 @@ CFLAGS+=   ERROR-tried-to-rebuild-during-make-install
>  .endif
>  .endif
>
> +# Please keep this if in sync with kern.mk
> +.if ${LD} != "ld" && (${CC:[1]:H} != ${LD:[1]:H} || ${LD:[1]:T} != "ld")
> +# Add -fuse-ld=${LD} if $LD is in a different directory or not called "ld".
> +# Note: Clang 12+ will prefer --ld-path= over -fuse-ld=.
> +.if ${COMPILER_TYPE} == "clang"
> +LDFLAGS+=      -fuse-ld=${LD:[1]}
> +.else
> +# GCC does not support an absolute path for -fuse-ld so we just print this
> +# warning instead and let the user add the required symlinks.
> +.warning LD (${LD}) is not the default linker for ${CC} but -fuse-ld= is not supported

FYI: This causes a huge amount of wrong and irrelevant warnings in the
build log for gcc cross compilers with XLD set, such as the toolchain
from pkg install amd64-xtoolchain-gcc.  That causes XLD to be set (via
CROSS_BINUTILS_PREFIX in Makefile.inc1) to a path which is indeed the
default linker for the cross compiler.  The warnings are harmless, but
annoying.  Sorry, I don't have a suggestion for a better method.

You can see an example in the build log from a gcc build in CI here
(although note that the build currently fails for unrelated reasons):
https://ci.freebsd.org/job/FreeBSD-head-amd64-gcc6_build/3131

> +.endif
> +.endif
> +
>  # Tell bmake not to mistake standard targets for things to be searched for
>  # or expect to ever be up-to-date.
>  PHONY_NOTMAIN = analyze afterdepend afterinstall all beforedepend beforeinstall \
>
> Modified: head/sys/conf/kern.mk
> ==============================================================================
> --- head/sys/conf/kern.mk       Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/sys/conf/kern.mk       Tue Aug 25 13:30:03 2020        (r364761)
> @@ -270,6 +270,22 @@ CFLAGS+=        -std=iso9899:1999
>  CFLAGS+=        -std=${CSTD}
>  .endif # CSTD
>
> +# Please keep this if in sync with bsd.sys.mk
> +.if ${LD} != "ld" && (${CC:[1]:H} != ${LD:[1]:H} || ${LD:[1]:T} != "ld")
> +# Add -fuse-ld=${LD} if $LD is in a different directory or not called "ld".
> +# Note: Clang 12+ will prefer --ld-path= over -fuse-ld=.
> +.if ${COMPILER_TYPE} == "clang"
> +# Note: unlike bsd.sys.mk we can't use LDFLAGS here since that is used for the
> +# flags required when linking the kernel. We don't need those flags when
> +# building the vdsos. However, we do need -fuse-ld, so use ${CCLDFLAGS} instead.
> +CCLDFLAGS+=    -fuse-ld=${LD:[1]}
> +.else
> +# GCC does not support an absolute path for -fuse-ld so we just print this
> +# warning instead and let the user add the required symlinks.
> +.warning LD (${LD}) is not the default linker for ${CC} but -fuse-ld= is not supported
> +.endif
> +.endif
> +
>  # Set target-specific linker emulation name.
>  LD_EMULATION_aarch64=aarch64elf
>  LD_EMULATION_amd64=elf_x86_64_fbsd
>
> Modified: head/sys/conf/kern.post.mk
> ==============================================================================
> --- head/sys/conf/kern.post.mk  Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/sys/conf/kern.post.mk  Tue Aug 25 13:30:03 2020        (r364761)
> @@ -228,7 +228,7 @@ kernel-clean:
>  # in the a.out ld.  For now, this works.
>  hack.pico: Makefile
>         :> hack.c
> -       ${CC} -shared ${CFLAGS} -nostdlib hack.c -o hack.pico
> +       ${CC} ${CCLDFLAGS} -shared ${CFLAGS} -nostdlib hack.c -o hack.pico
>         rm -f hack.c
>
>  offset.inc: $S/kern/genoffset.sh genoffset.o
>
> Modified: head/sys/modules/cloudabi32/Makefile
> ==============================================================================
> --- head/sys/modules/cloudabi32/Makefile        Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/sys/modules/cloudabi32/Makefile        Tue Aug 25 13:30:03 2020        (r364761)
> @@ -33,7 +33,7 @@ BINARY_ARCHITECTURE=i386
>  .endif
>
>  cloudabi32_vdso.o: ${VDSO_SRCS}
> -       ${CC} -x assembler-with-cpp -m32 -shared -nostdinc -nostdlib \
> +       ${CC} ${CCLDFLAGS} -x assembler-with-cpp -m32 -shared -nostdinc -nostdlib \
>             -Wl,-T${SYSDIR}/compat/cloudabi/cloudabi_vdso.lds \
>             ${VDSO_SRCS} -o ${.TARGET}
>
>
> Modified: head/sys/modules/cloudabi64/Makefile
> ==============================================================================
> --- head/sys/modules/cloudabi64/Makefile        Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/sys/modules/cloudabi64/Makefile        Tue Aug 25 13:30:03 2020        (r364761)
> @@ -25,7 +25,7 @@ BINARY_ARCHITECTURE=i386
>  .endif
>
>  cloudabi64_vdso.o: ${VDSO_SRCS}
> -       ${CC} -x assembler-with-cpp -shared -nostdinc -nostdlib \
> +       ${CC} ${CCLDFLAGS} -x assembler-with-cpp -shared -nostdinc -nostdlib \
>             -Wl,-T${SYSDIR}/compat/cloudabi/cloudabi_vdso.lds \
>             ${VDSO_SRCS} -o ${.TARGET}
>
>
> Modified: head/sys/modules/linux/Makefile
> ==============================================================================
> --- head/sys/modules/linux/Makefile     Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/sys/modules/linux/Makefile     Tue Aug 25 13:30:03 2020        (r364761)
> @@ -54,7 +54,7 @@ linux${SFX}_assym.h: linux${SFX}_genassym.o
>         sh ${SYSDIR}/kern/genassym.sh linux${SFX}_genassym.o > ${.TARGET}
>
>  linux${SFX}_locore.o: linux${SFX}_assym.h assym.inc
> -       ${CC} -x assembler-with-cpp -DLOCORE -m32 -shared -s                    \
> +       ${CC} ${CCLDFLAGS} -x assembler-with-cpp -DLOCORE -m32 -shared -s                       \
>         -pipe -I. -I${SYSDIR} ${WERROR} -Wall -fno-common -nostdinc -nostdlib   \
>         -fno-omit-frame-pointer -fPIC                                           \
>         -Wl,-T${SRCTOP}/sys/${MACHINE_CPUARCH}/linux${SFX}/${VDSO}.lds.s        \
>
> Modified: head/sys/modules/linux64/Makefile
> ==============================================================================
> --- head/sys/modules/linux64/Makefile   Tue Aug 25 13:29:57 2020        (r364760)
> +++ head/sys/modules/linux64/Makefile   Tue Aug 25 13:30:03 2020        (r364761)
> @@ -30,7 +30,7 @@ linux_assym.h: linux_genassym.o
>         sh ${SYSDIR}/kern/genassym.sh linux_genassym.o > ${.TARGET}
>
>  linux_locore.o: linux_locore.asm linux_assym.h
> -       ${CC} -x assembler-with-cpp -DLOCORE -shared -mcmodel=small     \
> +       ${CC} ${CCLDFLAGS} -x assembler-with-cpp -DLOCORE -shared -mcmodel=small        \
>         -pipe -I. -I${SYSDIR} ${WERROR} -Wall -fno-common -fPIC -nostdinc       \
>         -Wl,-T${SRCTOP}/sys/${MACHINE}/linux/${VDSO}.lds.s      \
>         -Wl,-soname=${VDSO}.so.1,-warn-common -nostdlib                 \



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAHgpiFwsv_9Zmw4CmFCd4FuYS8AaRB7pnF8K0Oiv824zE1vp4A>