Re: [PATCH 2/2] powerpc/vdso: Link with ld.lld when requested
On Tue, May 10, 2022 at 04:22:12PM +1000, Alexey Kardashevskiy wrote: > > > On 5/10/22 06:46, Nathan Chancellor wrote: > > The PowerPC vDSO is linked with $(CC) instead of $(LD), which means the > > default linker of the compiler is used instead of the linker requested > > by the builder. > > > >$ 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) > > > > The compiler option '-fuse-ld' 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'. > > > > Link: https://github.com/ClangBuiltLinux/linux/issues/774 > > Link: > > https://github.com/llvm/llvm-project/commit/1bc5c84710a8c73ef21295e63c19d10a8c71f2f5 > > Signed-off-by: Nathan Chancellor > > --- > > arch/powerpc/kernel/vdso/Makefile | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/arch/powerpc/kernel/vdso/Makefile > > b/arch/powerpc/kernel/vdso/Makefile > > index 954974287ee7..096b0bf1335f 100644 > > --- a/arch/powerpc/kernel/vdso/Makefile > > +++ b/arch/powerpc/kernel/vdso/Makefile > > @@ -48,6 +48,7 @@ UBSAN_SANITIZE := n > > KASAN_SANITIZE := n > > ccflags-y := -shared -fno-common -fno-builtin -nostdlib > > -Wl,--hash-style=both > > +ccflags-$(CONFIG_LD_IS_LLD) += $(call > > cc-option,--ld-path=$(LD),-fuse-ld=lld) > > > Out of curiosity - how does this work exactly? I can see --ld-path= in the > output so it works but there is no -fuse-ld=lld, is the second argument of > cc-option only picked when the first one is not supported? Correct. See Documentation/kbuild/makefiles.rst for more information about those macros if you are curious. > Anyway, > > Tested-by: Alexey Kardashevskiy > Reviewed-by: Alexey Kardashevskiy Thanks a lot! Cheers, Nathan
Re: [PATCH 2/2] powerpc/vdso: Link with ld.lld when requested
On 5/10/22 06:46, Nathan Chancellor wrote: The PowerPC vDSO is linked with $(CC) instead of $(LD), which means the default linker of the compiler is used instead of the linker requested by the builder. $ 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) The compiler option '-fuse-ld' 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'. Link: https://github.com/ClangBuiltLinux/linux/issues/774 Link: https://github.com/llvm/llvm-project/commit/1bc5c84710a8c73ef21295e63c19d10a8c71f2f5 Signed-off-by: Nathan Chancellor --- arch/powerpc/kernel/vdso/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile index 954974287ee7..096b0bf1335f 100644 --- a/arch/powerpc/kernel/vdso/Makefile +++ b/arch/powerpc/kernel/vdso/Makefile @@ -48,6 +48,7 @@ UBSAN_SANITIZE := n KASAN_SANITIZE := n ccflags-y := -shared -fno-common -fno-builtin -nostdlib -Wl,--hash-style=both +ccflags-$(CONFIG_LD_IS_LLD) += $(call cc-option,--ld-path=$(LD),-fuse-ld=lld) Out of curiosity - how does this work exactly? I can see --ld-path= in the output so it works but there is no -fuse-ld=lld, is the second argument of cc-option only picked when the first one is not supported? Anyway, Tested-by: Alexey Kardashevskiy Reviewed-by: Alexey Kardashevskiy CC32FLAGS := -Wl,-soname=linux-vdso32.so.1 -m32 AS32FLAGS := -D__VDSO32__ -s
Re: [PATCH 2/2] powerpc/vdso: Link with ld.lld when requested
On Mon, May 09, 2022 at 02:58:09PM -0700, Nick Desaulniers wrote: > On Mon, May 9, 2022 at 2:47 PM Nathan Chancellor wrote: > > > > On Mon, May 09, 2022 at 02:24:40PM -0700, Nick Desaulniers wrote: > > > On Mon, May 9, 2022 at 1:47 PM Nathan Chancellor > > > wrote: > > > > > > > > The PowerPC vDSO is linked with $(CC) instead of $(LD), which means the > > > > default linker of the compiler is used instead of the linker requested > > > > by the builder. > > > > > > > > $ 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) > > > > > > > > The compiler option '-fuse-ld' 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'. > > > > > > Perhaps worth adding some additional background from the cover letter > > > to the commit message that will actually go into the kernel, > > > particularly: > > > 1. Kbuild mostly invokes the compiler and linker distinctly; the ppc > > > vdso code uses the compiler as the linker driver though. > > > 2. When doing so, depending on how the compiler was configured, the > > > implicit default linker the compiler invokes might not match $LD. > > > > Sure, I think I can clear up these two points with something like: > > > > "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: > > > > > > > > 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." > > > > Thoughts? > > SGTM > > > > > > 3. This is a problem for LTO since clang may try to invoke ld.gold, > > > which is not supported as of > > > commit 75959d44f9dc ("kbuild: Fail if gold linker is detected") > > > > Technically, it seemed like ld.bfd was being invoked but the LLVMgold > > plugin did not exist. Regardless, moving to ld.lld will resolve that, > > since the LLVMgold plugin won't be needed. > > Oh indeed, invoking clang with `-flto -###` shows it does invoke the > system's linker with `-plugin path/to/LLVMgold.so`, not `ld.gold` > itself. I don't think we should use or depend on the LLVMgold.so > plugin either (I suspect it will invoke ld.gold, but as you noticed, I > don't bother to build LLVMgold.so). So, perhaps reworded (feel free > to reword further): > > 3. This is a problem for LTO since clang may try to invoke ld.bfd with > the LLVMgold.so plugin. > https://llvm.org/docs/GoldPlugin.html states that "usage of the LLVM > gold plugin with ld.bfd is not tested and therefore not officially > supported or recommended." Users should instead use ld.lld to drive > linking for LTO with clang. I'll stick this blurb above "The compiler option": "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." Yell if there is something I should change! > > > 4. Using the linker as the driver can cause ld.bfd 2.26 to
Re: [PATCH 2/2] powerpc/vdso: Link with ld.lld when requested
On Mon, May 09, 2022 at 02:24:40PM -0700, Nick Desaulniers wrote: > On Mon, May 9, 2022 at 1:47 PM Nathan Chancellor wrote: > > > > The PowerPC vDSO is linked with $(CC) instead of $(LD), which means the > > default linker of the compiler is used instead of the linker requested > > by the builder. > > > > $ 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) > > > > The compiler option '-fuse-ld' 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'. > > Perhaps worth adding some additional background from the cover letter > to the commit message that will actually go into the kernel, > particularly: > 1. Kbuild mostly invokes the compiler and linker distinctly; the ppc > vdso code uses the compiler as the linker driver though. > 2. When doing so, depending on how the compiler was configured, the > implicit default linker the compiler invokes might not match $LD. Sure, I think I can clear up these two points with something like: "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: 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." Thoughts? > 3. This is a problem for LTO since clang may try to invoke ld.gold, > which is not supported as of > commit 75959d44f9dc ("kbuild: Fail if gold linker is detected") Technically, it seemed like ld.bfd was being invoked but the LLVMgold plugin did not exist. Regardless, moving to ld.lld will resolve that, since the LLVMgold plugin won't be needed. > 4. Using the linker as the driver can cause ld.bfd 2.26 to crash. > https://lore.kernel.org/all/b2066ccd-2b81-6032-08e3-41105b400...@csgroup.eu/ > (Though, I wonder if that's because I was trying to add > --orphan-handling=warn, which we're not yet doing for the ppc vdso > AFAICT). I can add this if necessary but it seemed like there might have been other problems reported? I could just add a blanket "linker driver had issues, we'll try again later" or something of that effect? > Reviewed-by: Nick Desaulniers Thank you for the review as always! > > > > Link: https://github.com/ClangBuiltLinux/linux/issues/774 > > Link: > > https://github.com/llvm/llvm-project/commit/1bc5c84710a8c73ef21295e63c19d10a8c71f2f5 > > Signed-off-by: Nathan Chancellor > > --- > > arch/powerpc/kernel/vdso/Makefile | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/arch/powerpc/kernel/vdso/Makefile > > b/arch/powerpc/kernel/vdso/Makefile > > index 954974287ee7..096b0bf1335f 100644 > > --- a/arch/powerpc/kernel/vdso/Makefile > > +++ b/arch/powerpc/kernel/vdso/Makefile > > @@ -48,6 +48,7 @@ UBSAN_SANITIZE := n > > KASAN_SANITIZE := n > > > > ccflags-y := -shared -fno-common -fno-builtin -nostdlib > > -Wl,--hash-style=both > > +ccflags-$(CONFIG_LD_IS_LLD) += $(call > > cc-option,--ld-path=$(LD),-fuse-ld=lld) > > > > CC32FLAGS := -Wl,-soname=linux-vdso32.so.1 -m32 > > AS32FLAGS := -D__VDSO32__ -s > > -- > > 2.36.1 > > > > > -- > Thanks, > ~Nick Desaulniers
[PATCH 2/2] powerpc/vdso: Link with ld.lld when requested
The PowerPC vDSO is linked with $(CC) instead of $(LD), which means the default linker of the compiler is used instead of the linker requested by the builder. $ 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) The compiler option '-fuse-ld' 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'. Link: https://github.com/ClangBuiltLinux/linux/issues/774 Link: https://github.com/llvm/llvm-project/commit/1bc5c84710a8c73ef21295e63c19d10a8c71f2f5 Signed-off-by: Nathan Chancellor --- arch/powerpc/kernel/vdso/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile index 954974287ee7..096b0bf1335f 100644 --- a/arch/powerpc/kernel/vdso/Makefile +++ b/arch/powerpc/kernel/vdso/Makefile @@ -48,6 +48,7 @@ UBSAN_SANITIZE := n KASAN_SANITIZE := n ccflags-y := -shared -fno-common -fno-builtin -nostdlib -Wl,--hash-style=both +ccflags-$(CONFIG_LD_IS_LLD) += $(call cc-option,--ld-path=$(LD),-fuse-ld=lld) CC32FLAGS := -Wl,-soname=linux-vdso32.so.1 -m32 AS32FLAGS := -D__VDSO32__ -s -- 2.36.1