Patch "s390/vdso: Use $(LD) instead of $(CC) to link vDSO" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    s390/vdso: Use $(LD) instead of $(CC) to link vDSO

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     s390-vdso-use-ld-instead-of-cc-to-link-vdso.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d4e6cb7af9745809667ef2973ecf048b55c06295
Author: Nathan Chancellor <natechancellor@xxxxxxxxx>
Date:   Tue Jun 2 12:25:24 2020 -0700

    s390/vdso: Use $(LD) instead of $(CC) to link vDSO
    
    [ Upstream commit 2b2a25845d534ac6d55086e35c033961fdd83a26 ]
    
    Currently, the VDSO is being linked through $(CC). This does not match
    how the rest of the kernel links objects, which is through the $(LD)
    variable.
    
    When clang is built in a default configuration, it first attempts to use
    the target triple's default linker, which is just ld. However, the user
    can override this through the CLANG_DEFAULT_LINKER cmake define so that
    clang uses another linker by default, such as LLVM's own linker, ld.lld.
    This can be useful to get more optimized links across various different
    projects.
    
    However, this is problematic for the s390 vDSO because ld.lld does not
    have any s390 emulatiom support:
    
    https://github.com/llvm/llvm-project/blob/llvmorg-10.0.1-rc1/lld/ELF/Driver.cpp#L132-L150
    
    Thus, if a user is using a toolchain with ld.lld as the default, they
    will see an error, even if they have specified ld.bfd through the LD
    make variable:
    
    $ make -j"$(nproc)" -s ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- LLVM=1 \
                           LD=s390x-linux-gnu-ld \
                           defconfig arch/s390/kernel/vdso64/
    ld.lld: error: unknown emulation: elf64_s390
    clang-11: error: linker command failed with exit code 1 (use -v to see invocation)
    
    Normally, '-fuse-ld=bfd' could be used to get around this; however, this
    can be fragile, depending on paths and variable naming. The cleaner
    solution for the kernel is to take advantage of the fact that $(LD) can
    be invoked directly, which bypasses the heuristics of $(CC) and respects
    the user's choice. Similar changes have been done for ARM, ARM64, and
    MIPS.
    
    Link: https://lkml.kernel.org/r/20200602192523.32758-1-natechancellor@xxxxxxxxx
    Link: https://github.com/ClangBuiltLinux/linux/issues/1041
    Signed-off-by: Nathan Chancellor <natechancellor@xxxxxxxxx>
    Reviewed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>
    [heiko.carstens@xxxxxxxxxx: add --build-id flag]
    Signed-off-by: Heiko Carstens <heiko.carstens@xxxxxxxxxx>
    Signed-off-by: Vasily Gorbik <gor@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile
index bec19e7e6e1cf..4a66a1cb919b1 100644
--- a/arch/s390/kernel/vdso64/Makefile
+++ b/arch/s390/kernel/vdso64/Makefile
@@ -18,8 +18,8 @@ KBUILD_AFLAGS_64 += -m64 -s
 
 KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
 KBUILD_CFLAGS_64 += -m64 -fPIC -shared -fno-common -fno-builtin
-KBUILD_CFLAGS_64 += -nostdlib -Wl,-soname=linux-vdso64.so.1 \
-		    -Wl,--hash-style=both
+ldflags-y := -fPIC -shared -nostdlib -soname=linux-vdso64.so.1 \
+	     --hash-style=both --build-id -T
 
 $(targets:%=$(obj)/%.dbg): KBUILD_CFLAGS = $(KBUILD_CFLAGS_64)
 $(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_64)
@@ -37,8 +37,8 @@ KASAN_SANITIZE := n
 $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
 
 # link rule for the .so file, .lds has to be first
-$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE
-	$(call if_changed,vdso64ld)
+$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) FORCE
+	$(call if_changed,ld)
 
 # strip rule for the .so file
 $(obj)/%.so: OBJCOPYFLAGS := -S
@@ -50,8 +50,6 @@ $(obj-vdso64): %.o: %.S FORCE
 	$(call if_changed_dep,vdso64as)
 
 # actual build commands
-quiet_cmd_vdso64ld = VDSO64L $@
-      cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
 quiet_cmd_vdso64as = VDSO64A $@
       cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux