Mian Yousaf Kaukab 13ea47
From: Nick Desaulniers <ndesaulniers@google.com>
Mian Yousaf Kaukab 13ea47
Date: Thu, 17 Dec 2020 16:24:32 -0800
Mian Yousaf Kaukab 13ea47
Subject: arm64: link with -z norelro for LLD or aarch64-elf
Mian Yousaf Kaukab 13ea47
MIME-Version: 1.0
Mian Yousaf Kaukab 13ea47
Content-Type: text/plain; charset=UTF-8
Mian Yousaf Kaukab 13ea47
Content-Transfer-Encoding: 8bit
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
Git-commit: 311bea3cb9ee20ef150ca76fc60a592bf6b159f5
Mian Yousaf Kaukab 13ea47
Patch-mainline: v5.11-rc3
Mian Yousaf Kaukab 13ea47
References: git-fixes
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
With GNU binutils 2.35+, linking with BFD produces warnings for vmlinux:
Mian Yousaf Kaukab 13ea47
aarch64-linux-gnu-ld: warning: -z norelro ignored
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
BFD can produce this warning when the target emulation mode does not
Mian Yousaf Kaukab 13ea47
support RELRO program headers, and -z relro or -z norelro is passed.
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
Alan Modra clarifies:
Mian Yousaf Kaukab 13ea47
  The default linker emulation for an aarch64-linux ld.bfd is
Mian Yousaf Kaukab 13ea47
  -maarch64linux, the default for an aarch64-elf linker is
Mian Yousaf Kaukab 13ea47
  -maarch64elf.  They are not equivalent.  If you choose -maarch64elf
Mian Yousaf Kaukab 13ea47
  you get an emulation that doesn't support -z relro.
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
The ARCH=arm64 kernel prefers -maarch64elf, but may fall back to
Mian Yousaf Kaukab 13ea47
-maarch64linux based on the toolchain configuration.
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
LLD will always create RELRO program header regardless of target
Mian Yousaf Kaukab 13ea47
emulation.
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
To avoid the above warning when linking with BFD, pass -z norelro only
Mian Yousaf Kaukab 13ea47
when linking with LLD or with -maarch64linux.
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
Fixes: 3b92fa7485eb ("arm64: link with -z norelro regardless of CONFIG_RELOCATABLE")
Mian Yousaf Kaukab 13ea47
Fixes: 3bbd3db86470 ("arm64: relocatable: fix inconsistencies in linker script and options")
Mian Yousaf Kaukab 13ea47
Cc: <stable@vger.kernel.org> # 5.0.x-
Mian Yousaf Kaukab 13ea47
Reported-by: kernelci.org bot <bot@kernelci.org>
Mian Yousaf Kaukab 13ea47
Reported-by: Quentin Perret <qperret@google.com>
Mian Yousaf Kaukab 13ea47
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Mian Yousaf Kaukab 13ea47
Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
Mian Yousaf Kaukab 13ea47
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Mian Yousaf Kaukab 13ea47
Cc: Alan Modra <amodra@gmail.com>
Mian Yousaf Kaukab 13ea47
Cc: Fāng-ruì Sòng <maskray@google.com>
Mian Yousaf Kaukab 13ea47
Link: https://lore.kernel.org/r/20201218002432.788499-1-ndesaulniers@google.com
Mian Yousaf Kaukab 13ea47
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Mian Yousaf Kaukab 13ea47
Signed-off-by: Mian Yousaf Kaukab <ykaukab@suse.de>
Mian Yousaf Kaukab 13ea47
---
Mian Yousaf Kaukab 13ea47
 arch/arm64/Makefile |   10 +++++++---
Mian Yousaf Kaukab 13ea47
 1 file changed, 7 insertions(+), 3 deletions(-)
Mian Yousaf Kaukab 13ea47
Mian Yousaf Kaukab 13ea47
--- a/arch/arm64/Makefile
Mian Yousaf Kaukab 13ea47
+++ b/arch/arm64/Makefile
Mian Yousaf Kaukab 13ea47
@@ -10,7 +10,7 @@
Mian Yousaf Kaukab 13ea47
 #
Mian Yousaf Kaukab 13ea47
 # Copyright (C) 1995-2001 by Russell King
Mian Yousaf Kaukab 13ea47
 
Mian Yousaf Kaukab 13ea47
-LDFLAGS_vmlinux	:=--no-undefined -X -z norelro
Mian Yousaf Kaukab 13ea47
+LDFLAGS_vmlinux	:=--no-undefined -X
Mian Yousaf Kaukab 13ea47
 CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
Mian Yousaf Kaukab 13ea47
 GZFLAGS		:=-9
Mian Yousaf Kaukab 13ea47
 
Mian Yousaf Kaukab 13ea47
@@ -83,17 +83,21 @@ CHECKFLAGS	+= -D__AARCH64EB__
Mian Yousaf Kaukab 13ea47
 AS		+= -EB
Mian Yousaf Kaukab 13ea47
 # Prefer the baremetal ELF build target, but not all toolchains include
Mian Yousaf Kaukab 13ea47
 # it so fall back to the standard linux version if needed.
Mian Yousaf Kaukab 13ea47
-KBUILD_LDFLAGS	+= -EB $(call ld-option, -maarch64elfb, -maarch64linuxb)
Mian Yousaf Kaukab 13ea47
+KBUILD_LDFLAGS	+= -EB $(call ld-option, -maarch64elfb, -maarch64linuxb -z norelro)
Mian Yousaf Kaukab 13ea47
 UTS_MACHINE	:= aarch64_be
Mian Yousaf Kaukab 13ea47
 else
Mian Yousaf Kaukab 13ea47
 KBUILD_CPPFLAGS	+= -mlittle-endian
Mian Yousaf Kaukab 13ea47
 CHECKFLAGS	+= -D__AARCH64EL__
Mian Yousaf Kaukab 13ea47
 AS		+= -EL
Mian Yousaf Kaukab 13ea47
 # Same as above, prefer ELF but fall back to linux target if needed.
Mian Yousaf Kaukab 13ea47
-KBUILD_LDFLAGS	+= -EL $(call ld-option, -maarch64elf, -maarch64linux)
Mian Yousaf Kaukab 13ea47
+KBUILD_LDFLAGS	+= -EL $(call ld-option, -maarch64elf, -maarch64linux -z norelro)
Mian Yousaf Kaukab 13ea47
 UTS_MACHINE	:= aarch64
Mian Yousaf Kaukab 13ea47
 endif
Mian Yousaf Kaukab 13ea47
 
Mian Yousaf Kaukab 13ea47
+ifeq ($(CONFIG_LD_IS_LLD), y)
Mian Yousaf Kaukab 13ea47
+KBUILD_LDFLAGS	+= -z norelro
Mian Yousaf Kaukab 13ea47
+endif
Mian Yousaf Kaukab 13ea47
+
Mian Yousaf Kaukab 13ea47
 CHECKFLAGS	+= -D__aarch64__
Mian Yousaf Kaukab 13ea47
 
Mian Yousaf Kaukab 13ea47
 ifeq ($(CONFIG_ARM64_MODULE_PLTS),y)