• Nathan Chancellor's avatar
    powerpc/vdso: Link with ld.lld when requested · 4406b122
    Nathan Chancellor authored
    The PowerPC vDSO uses $(CC) to link, which differs from the rest of the
    kernel, which uses $(LD) directly. As a result, the default linker of
    the compiler is used, which may differ from the linker requested by the
    builder. For example:
    
      $ make ARCH=powerpc LLVM=1 mrproper defconfig arch/powerpc/kernel/vdso/
      ...
    
      $ llvm-readelf -p .comment arch/powerpc/kernel/vdso/vdso{32,64}.so.dbg
    
      File: arch/powerpc/kernel/vdso/vdso32.so.dbg
      String dump of section '.comment':
      [     0] clang version 14.0.0 (Fedora 14.0.0-1.fc37)
    
      File: arch/powerpc/kernel/vdso/vdso64.so.dbg
      String dump of section '.comment':
      [     0] clang version 14.0.0 (Fedora 14.0.0-1.fc37)
    
    LLVM=1 sets LD=ld.lld but ld.lld is not used to link the vDSO; GNU ld is
    because "ld" is the default linker for clang on most Linux platforms.
    
    This is a problem for Clang's Link Time Optimization as implemented in
    the kernel because use of GNU ld with LTO requires the LLVMgold plugin,
    which is not technically supported for ld.bfd per
    https://llvm.org/docs/GoldPlugin.html. Furthermore, if LLVMgold.so is
    missing from a user's system, the build will fail, even though LTO as it
    is implemented in the kernel requires ld.lld to avoid this dependency in
    the first place.
    
    Ultimately, the PowerPC vDSO should be converted to compiling and
    linking with $(CC) and $(LD) respectively but there were issues last
    time this was tried, potentially due to older but supported tool
    versions. To avoid regressing GCC + binutils, use the compiler option
    '-fuse-ld', which tells the compiler which linker to use when it is
    invoked as both the compiler and linker. Use '-fuse-ld=lld' when
    LD=ld.lld has been specified (CONFIG_LD_IS_LLD) so that the vDSO is
    linked with the same linker as the rest of the kernel.
    
      $ llvm-readelf -p .comment arch/powerpc/kernel/vdso/vdso{32,64}.so.dbg
    
      File: arch/powerpc/kernel/vdso/vdso32.so.dbg
      String dump of section '.comment':
      [     0] Linker: LLD 14.0.0
      [    14] clang version 14.0.0 (Fedora 14.0.0-1.fc37)
    
      File: arch/powerpc/kernel/vdso/vdso64.so.dbg
      String dump of section '.comment':
      [     0] Linker: LLD 14.0.0
      [    14] clang version 14.0.0 (Fedora 14.0.0-1.fc37)
    
    LD can be a full path to ld.lld, which will not be handled properly by
    '-fuse-ld=lld' if the full path to ld.lld is outside of the compiler's
    search path. '-fuse-ld' can take a path to the linker but it is
    deprecated in clang 12.0.0; '--ld-path' is preferred for this scenario.
    
    Use '--ld-path' if it is supported, as it will handle a full path or
    just 'ld.lld' properly. See the LLVM commit below for the full details
    of '--ld-path'.
    Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
    Tested-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://github.com/ClangBuiltLinux/linux/issues/774
    Link: https://github.com/llvm/llvm-project/commit/1bc5c84710a8c73ef21295e63c19d10a8c71f2f5
    Link: https://lore.kernel.org/r/20220511185001.3269404-3-nathan@kernel.org
    4406b122
Makefile 4.42 KB