Message ID | 20231124035534.70432-1-wangrui@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | LoongArch: Apply dynamic relocations for LLD | expand |
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 > >
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)
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(-)