Received: by 2002:a25:23cc:0:0:0:0:0 with SMTP id j195csp1498046ybj; Tue, 5 May 2020 22:56:49 -0700 (PDT) X-Google-Smtp-Source: APiQypLcOuA0GcYSKHGOoZtbWuAEWqQ8K8xivTfOkGRPPXU91OtYRdxmrTF1WEUsCZ1n50QBdvJh X-Received: by 2002:a05:6402:711:: with SMTP id w17mr5583307edx.228.1588744608882; Tue, 05 May 2020 22:56:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588744608; cv=none; d=google.com; s=arc-20160816; b=Xc9S0w/OrpgJXgtGh8bftUyxLQJVCX51h7zPeVtSYzofLvv1VAj+MqKUgBqu8SveZd G/sXmJv6tsWUXgOFwh3TSATYUbvWyhfCczNjofwe6UOWghOQDl0UiDa7rCEc8FuzPUiF gXjNjpZNjLNpXn63MiE1JOijq+7MHjzH4FqGEOoWo8IlK7Sr1g4SQzcYseT+TlTGFbxq 3d0nbNJ2+oOrC+xXEDEY7KV6axbeOwLX7AREUnARlOscB7ZyY83Dobw7feRSgYCLMe/D r98ULPFsmH3N+xB0fLwddMttBpe/Mq8WGB8FRIZZ3kRTF21pUpdGt7RjspfckaUm1LHU wOTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=yCwKL/KjWTFzErtZfWH1qn9qqKTNRGRHmWhZYeYpY14=; b=fiSoAv7uDjdFwd3RcQnDjQHwYZ0bG+kyudc3rbRw9EQiKhmpOTxDM3niJKmbka8c/K 55NU0pkL0ckm12Nac0Kdev4Q+CmAKks800mH7aZoknR1jtcKZc9iIn01Momw7K4RHU/G vnchqiZ+pjHCfjwuXBLM8j/PNVmFsEo5BupjzMEGHfR2FmnzJ1SWXKiuzZodVCqWsm7Q qXvF0rRKUBEY0JS1I9AHHgUufTs9pOe9h+bfiUv0KGIXH7OBMMjhxjPc8sfR3jw4atn7 Qn6gPXuBCNe5SfCYMgD/Fi8QIXeEAY9q/vtHv7s5bbgRXPsfQM+a49DCWAgBe50XZZJP ylJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@flygoat.com header.s=vultr header.b=EGxnwT5h; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=flygoat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d6si599112ejy.428.2020.05.05.22.56.26; Tue, 05 May 2020 22:56:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@flygoat.com header.s=vultr header.b=EGxnwT5h; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=flygoat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727771AbgEFFw5 (ORCPT + 99 others); Wed, 6 May 2020 01:52:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54132 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1727032AbgEFFw5 (ORCPT ); Wed, 6 May 2020 01:52:57 -0400 Received: from vultr.net.flygoat.com (vultr.net.flygoat.com [IPv6:2001:19f0:6001:3633:5400:2ff:fe8c:553]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20038C061A0F; Tue, 5 May 2020 22:52:57 -0700 (PDT) Received: from localhost.localdomain (unknown [142.147.94.151]) by vultr.net.flygoat.com (Postfix) with ESMTPSA id 3FD83204A8; Wed, 6 May 2020 05:52:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=flygoat.com; s=vultr; t=1588744374; bh=Qs/DwRJNvaR0cgSNfVQJ/PlQdecYtaVAKH2WIZDkGtA=; h=From:To:Cc:Subject:Date:From; b=EGxnwT5hhlrhm1PEiMc1FZkNDebDdalGurlZlPd566I3ucuimacpx70s9iUHBi2zD qr+9GS07jQ8Humbqvxe2yY6DiyUpkRZknEYBtnmf5/lWDjVwr3dHJKfAk9IURb4L3U UV6oLmzGNblr/EWBhFajD1DShp71vzlJ5nJWlWeltYvlTRgqgrPzM+dkSSCM8si5kP 28dIC7mdnLZqHH+o0PotEf0qRAZHf2auaFlnBbRbP8UgR92ht1Wb6XEAD4BTofCMRS fpMJ0BQIlrQhWqrLYprKqY2mtU2GQTHrK1jclJNeIUIa5mB4LPoqnVtnO3QQwyOIDF ooxLHKZOKXe9A== From: Jiaxun Yang To: linux-mips@vger.kernel.org Cc: Jiaxun Yang , clang-built-linux@googlegroups.com, "Maciej W . Rozycki" , Fangrui Song , Kees Cook , Nathan Chancellor , Thomas Bogendoerfer , Paul Burton , Masahiro Yamada , Jouni Hogander , Kevin Darbyshire-Bryant , Borislav Petkov , Heiko Carstens , linux-kernel@vger.kernel.org Subject: Date: Wed, 6 May 2020 13:52:45 +0800 Message-Id: <20200506055245.3013374-1-jiaxun.yang@flygoat.com> X-Mailer: git-send-email 2.26.0.rc2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Subject: [PATCH v6] MIPS: Truncate link address into 32bit for 32bit kernel In-Reply-To: <20200413062651.3992652-1-jiaxun.yang@flygoat.com> 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 Link: https://github.com/ClangBuiltLinux/linux/issues/786 Link: https://sourceware.org/bugzilla/show_bug.cgi?id=25784 Reviewed-by: Fangrui Song Reviewed-by: Kees Cook Tested-by: Nathan Chancellor Cc: Maciej W. Rozycki --- V2: Take MaskRay's shell magic. V3: After spent an hour on dealing with special character issue in Makefile, I gave up to do shell hacks and write a util in C instead. Thanks Maciej for pointing out Makefile variable problem. v4: Finally we managed to find a Makefile method to do it properly thanks to Kees. As it's too far from the initial version, I removed Review & Test tag from Nick and Fangrui and Cc instead. v5: Care vmlinuz as well. v6: Rename to LIKER_LOAD_ADDRESS --- 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 e1c44aed8156..68c0f22fefc0 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile @@ -288,12 +288,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 0df0ee8a298d..3d391256ab7e 100644 --- a/arch/mips/boot/compressed/Makefile +++ b/arch/mips/boot/compressed/Makefile @@ -90,7 +90,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 a5f00ec73ea6..5226cd8e4bee 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S @@ -55,7 +55,7 @@ SECTIONS /* . = 0xa800000000300000; */ . = 0xffffffff80300000; #endif - . = VMLINUX_LOAD_ADDRESS; + . = LINKER_LOAD_ADDRESS; /* read-only */ _text = .; /* Text and read-only data */ .text : {