lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 45/72] MIPS: Truncate link address into 32bit for 32bit kernel
    Date
    From: Jiaxun Yang <jiaxun.yang@flygoat.com>

    [ Upstream commit ff487d41036035376e47972c7c522490b839ab37 ]

    LLD failed to link vmlinux with 64bit load address for 32bit ELF
    while bfd will strip 64bit address into 32bit silently.
    To fix LLD build, we should truncate load address provided by platform
    into 32bit for 32bit kernel.

    Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
    Link: https://github.com/ClangBuiltLinux/linux/issues/786
    Link: https://sourceware.org/bugzilla/show_bug.cgi?id=25784
    Reviewed-by: Fangrui Song <maskray@google.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Tested-by: Nathan Chancellor <natechancellor@gmail.com>
    Cc: Maciej W. Rozycki <macro@linux-mips.org>
    Tested-by: Nick Desaulniers <ndesaulniers@google.com>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/mips/Makefile | 13 ++++++++++++-
    arch/mips/boot/compressed/Makefile | 2 +-
    arch/mips/kernel/vmlinux.lds.S | 2 +-
    3 files changed, 14 insertions(+), 3 deletions(-)

    diff --git a/arch/mips/Makefile b/arch/mips/Makefile
    index 5977884b008e..a4a06d173858 100644
    --- a/arch/mips/Makefile
    +++ b/arch/mips/Makefile
    @@ -279,12 +279,23 @@ ifdef CONFIG_64BIT
    endif
    endif

    +# When linking a 32-bit executable the LLVM linker cannot cope with a
    +# 32-bit load address that has been sign-extended to 64 bits. Simply
    +# remove the upper 32 bits then, as it is safe to do so with other
    +# linkers.
    +ifdef CONFIG_64BIT
    + load-ld = $(load-y)
    +else
    + load-ld = $(subst 0xffffffff,0x,$(load-y))
    +endif
    +
    KBUILD_AFLAGS += $(cflags-y)
    KBUILD_CFLAGS += $(cflags-y)
    -KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y)
    +KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y) -DLINKER_LOAD_ADDRESS=$(load-ld)
    KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)

    bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \
    + LINKER_LOAD_ADDRESS=$(load-ld) \
    VMLINUX_ENTRY_ADDRESS=$(entry-y) \
    PLATFORM="$(platform-y)" \
    ITS_INPUTS="$(its-y)"
    diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
    index baa34e4deb78..516e593a8ee9 100644
    --- a/arch/mips/boot/compressed/Makefile
    +++ b/arch/mips/boot/compressed/Makefile
    @@ -87,7 +87,7 @@ ifneq ($(zload-y),)
    VMLINUZ_LOAD_ADDRESS := $(zload-y)
    else
    VMLINUZ_LOAD_ADDRESS = $(shell $(obj)/calc_vmlinuz_load_addr \
    - $(obj)/vmlinux.bin $(VMLINUX_LOAD_ADDRESS))
    + $(obj)/vmlinux.bin $(LINKER_LOAD_ADDRESS))
    endif
    UIMAGE_LOADADDR = $(VMLINUZ_LOAD_ADDRESS)

    diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
    index 36f2e860ba3e..be63fff95b2a 100644
    --- a/arch/mips/kernel/vmlinux.lds.S
    +++ b/arch/mips/kernel/vmlinux.lds.S
    @@ -50,7 +50,7 @@ SECTIONS
    /* . = 0xa800000000300000; */
    . = 0xffffffff80300000;
    #endif
    - . = VMLINUX_LOAD_ADDRESS;
    + . = LINKER_LOAD_ADDRESS;
    /* read-only */
    _text = .; /* Text and read-only data */
    .text : {
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-09 01:48    [W:4.175 / U:0.500 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site