diff options
author | WANG Rui <wangrui@loongson.cn> | 2023-12-09 15:49:15 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-01-20 11:51:42 +0100 |
commit | 10d9f8ed6dafb0ed8da77670b7b6098c8304ab1b (patch) | |
tree | 97156433578965a21dc5cfd0dad596ed60ccd3b1 | |
parent | 3584858bfd34706b3dc60f2b83ef135ead1ffefa (diff) |
LoongArch: Apply dynamic relocations for LLD
[ Upstream commit eea673e9d5ea994c60b550ffb684413d3759b3f4 ]
For the following assembly code:
.text
.global func
func:
nop
.data
var:
.dword func
When linked with `-pie`, GNU LD populates the `var` variable with the
pre-relocated value of `func`. However, LLVM LLD does not exhibit the
same behavior. This issue also arises with the `kernel_entry` in arch/
loongarch/kernel/head.S:
_head:
.word MZ_MAGIC /* "MZ", MS-DOS header */
.org 0x8
.dword kernel_entry /* Kernel entry point */
The correct kernel entry from the MS-DOS header is crucial for jumping
to vmlinux from zboot. This necessity is why the compressed relocatable
kernel compiled by Clang encounters difficulties in booting.
To address this problem, it is proposed to apply dynamic relocations to
place with `--apply-dynamic-relocs`.
Link: https://github.com/ClangBuiltLinux/linux/issues/1962
Signed-off-by: WANG Rui <wangrui@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r-- | arch/loongarch/Makefile | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile index 96747bfec1a1..d423fba7c406 100644 --- a/arch/loongarch/Makefile +++ b/arch/loongarch/Makefile @@ -80,7 +80,7 @@ endif ifeq ($(CONFIG_RELOCATABLE),y) KBUILD_CFLAGS_KERNEL += -fPIE -LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext +LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext $(call ld-option, --apply-dynamic-relocs) endif cflags-y += $(call cc-option, -mno-check-zero-division) |