[PATCH] LoongArch: Apply dynamic relocations for LLD

WANG Rui posted 1 patch 2 years ago
arch/loongarch/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[PATCH] LoongArch: Apply dynamic relocations for LLD
Posted by WANG Rui 2 years ago
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 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>
---
 arch/loongarch/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
index 1f0d74403419..05ab85118212 100644
--- a/arch/loongarch/Makefile
+++ b/arch/loongarch/Makefile
@@ -83,7 +83,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)
-- 
2.43.0
Re: [PATCH] LoongArch: Apply dynamic relocations for LLD
Posted by Huacai Chen 2 years ago
Queued for loongarch-fixes, thanks.

Huacai

On Fri, Nov 24, 2023 at 11:56 AM WANG Rui <wangrui@loongson.cn> wrote:
>
> 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 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>
> ---
>  arch/loongarch/Makefile | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> index 1f0d74403419..05ab85118212 100644
> --- a/arch/loongarch/Makefile
> +++ b/arch/loongarch/Makefile
> @@ -83,7 +83,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)
> --
> 2.43.0
>
>