All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4] MIPS: Truncate link address into 32bit for 32bit kernel
@ 2020-04-13  6:26 Jiaxun Yang
  2020-04-13  6:59 ` Maciej W. Rozycki
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Jiaxun Yang @ 2020-04-13  6:26 UTC (permalink / raw)
  To: linux-mips
  Cc: macro, clang-built-linux, Jiaxun Yang, Fangrui Song,
	Nathan Chancellor, Thomas Bogendoerfer, Borislav Petkov,
	Kees Cook, Heiko Carstens, linux-kernel

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
Cc: Fangrui Song <maskray@google.com>
Cc: Nathan Chancellor <natechancellor@gmail.com>
--
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.
---
 arch/mips/Makefile             | 12 +++++++++++-
 arch/mips/kernel/vmlinux.lds.S |  2 +-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index e1c44aed8156..18495568f03e 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -288,9 +288,19 @@ 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) -DVMLINUX_LINK_ADDRESS=$(load-ld)
 KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
 
 bootvars-y	= VMLINUX_LOAD_ADDRESS=$(load-y) \
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;
+	. = VMLINUX_LINK_ADDRESS;
 	/* read-only */
 	_text = .;	/* Text and read-only data */
 	.text : {
-- 
2.26.0.rc2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2020-05-13 22:38 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-13  6:26 [PATCH v4] MIPS: Truncate link address into 32bit for 32bit kernel Jiaxun Yang
2020-04-13  6:59 ` Maciej W. Rozycki
2020-04-13  7:32   ` Jiaxun Yang
2020-04-13 15:34     ` Fangrui Song
2020-04-13 20:08       ` Maciej W. Rozycki
2020-04-13 20:06     ` Maciej W. Rozycki
2020-04-13 16:25 ` Kees Cook
2020-04-13 18:52 ` Nathan Chancellor
2020-04-22 14:32 ` [PATCH v5] " Jiaxun Yang
2020-04-22 22:16   ` Nathan Chancellor
2020-04-23  0:10   ` Maciej W. Rozycki
2020-04-23  5:42     ` Jiaxun Yang
2020-04-24 12:22       ` Maciej W. Rozycki
2020-05-04 15:46         ` Thomas Bogendoerfer
2020-05-04 16:09           ` Jiaxun Yang
2020-05-04 16:56             ` Thomas Bogendoerfer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.