Message ID | 20230329045329.64565-7-alexghiti@rivosinc.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 559d1e45a16dcf1542e430ea3dce9ab625be98d0 |
Headers | show |
Series | Introduce 64b relocatable kernel | expand |
Context | Check | Description |
---|---|---|
conchuod/cover_letter | success | Series has a cover letter |
conchuod/tree_selection | success | Guessed tree name to be for-next at HEAD d34a6b715a23 |
conchuod/fixes_present | success | Fixes tag not required for -next series |
conchuod/maintainers_pattern | success | MAINTAINERS pattern errors before the patch: 1 and now 1 |
conchuod/verify_signedoff | success | Signed-off-by tag matches author and committer |
conchuod/kdoc | success | Errors and warnings before: 0 this patch: 0 |
conchuod/build_rv64_clang_allmodconfig | success | Errors and warnings before: 18 this patch: 18 |
conchuod/module_param | success | Was 0 now: 0 |
conchuod/build_rv64_gcc_allmodconfig | success | Errors and warnings before: 18 this patch: 18 |
conchuod/build_rv32_defconfig | success | Build OK |
conchuod/dtb_warn_rv64 | success | Errors and warnings before: 3 this patch: 3 |
conchuod/header_inline | success | No static functions without inline keyword in header files |
conchuod/checkpatch | warning | WARNING: Possible repeated word: 'vmlinux' |
conchuod/source_inline | success | Was 0 now: 0 |
conchuod/build_rv64_nommu_k210_defconfig | success | Build OK |
conchuod/verify_fixes | success | No Fixes tag |
conchuod/build_rv64_nommu_virt_defconfig | success | Build OK |
On 2023-03-29, Alexandre Ghiti wrote: >To circumvent an issue where placing the relocations inside the init >sections produces empty relocations, use --emit-relocs. But to avoid >carrying those relocations in vmlinux, use an intermediate >vmlinux.relocs file which is a copy of vmlinux *before* stripping its >relocations. > >Suggested-by: Björn Töpel <bjorn@kernel.org> >Suggested-by: Nick Desaulniers <ndesaulniers@google.com> >Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com> >--- > arch/riscv/Makefile | 2 +- > arch/riscv/Makefile.postlink | 13 +++++++++++++ > arch/riscv/boot/Makefile | 7 +++++++ > 3 files changed, 21 insertions(+), 1 deletion(-) > >diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile >index 860b09e409c7..7dc6904a6836 100644 >--- a/arch/riscv/Makefile >+++ b/arch/riscv/Makefile >@@ -8,7 +8,7 @@ > > OBJCOPYFLAGS := -O binary > ifeq ($(CONFIG_RELOCATABLE),y) >- LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro >+ LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro --emit-relocs > KBUILD_CFLAGS += -fPIE > endif > ifeq ($(CONFIG_DYNAMIC_FTRACE),y) >[...] (Not subscribed. b4 am https://lore.kernel.org/all/20230329045329.64565-7-alexghiti@rivosinc.com/ neomutt -f v9_20230329_alexghiti_introduce_64b_relocatable_kernel.mbx) This commit 559d1e45a16dcf1542e430ea3dce9ab625be98d0 introduced --emit-relocs to arch/riscv/. I am concerned that --emit-relocs's relocation-type-changing behavior may not be desired and any new use could become problematic. https://sourceware.org/bugzilla/show_bug.cgi?id=30844 "ld riscv: --emit-relocs does not retain the original relocation type" If either -mno-relax or --no-relax is used, --emit-relocs should be fine.
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index 860b09e409c7..7dc6904a6836 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -8,7 +8,7 @@ OBJCOPYFLAGS := -O binary ifeq ($(CONFIG_RELOCATABLE),y) - LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro + LDFLAGS_vmlinux += -shared -Bsymbolic -z notext -z norelro --emit-relocs KBUILD_CFLAGS += -fPIE endif ifeq ($(CONFIG_DYNAMIC_FTRACE),y) diff --git a/arch/riscv/Makefile.postlink b/arch/riscv/Makefile.postlink index d5de8d520d3e..a46fc578b30b 100644 --- a/arch/riscv/Makefile.postlink +++ b/arch/riscv/Makefile.postlink @@ -15,12 +15,25 @@ quiet_cmd_relocs_check = CHKREL $@ cmd_relocs_check = \ $(CONFIG_SHELL) $(srctree)/arch/riscv/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@" +ifdef CONFIG_RELOCATABLE +quiet_cmd_cp_vmlinux_relocs = CPREL vmlinux.relocs +cmd_cp_vmlinux_relocs = cp vmlinux vmlinux.relocs + +quiet_cmd_relocs_strip = STRIPREL $@ +cmd_relocs_strip = $(OBJCOPY) --remove-section='.rel.*' \ + --remove-section='.rel__*' \ + --remove-section='.rela.*' \ + --remove-section='.rela__*' $@ +endif + # `@true` prevents complaint when there is nothing to be done vmlinux: FORCE @true ifdef CONFIG_RELOCATABLE $(call if_changed,relocs_check) + $(call if_changed,cp_vmlinux_relocs) + $(call if_changed,relocs_strip) endif %.ko: FORCE diff --git a/arch/riscv/boot/Makefile b/arch/riscv/boot/Makefile index c72de7232abb..22b13947bd13 100644 --- a/arch/riscv/boot/Makefile +++ b/arch/riscv/boot/Makefile @@ -33,7 +33,14 @@ $(obj)/xipImage: vmlinux FORCE endif +ifdef CONFIG_RELOCATABLE +vmlinux.relocs: vmlinux + @ (! [ -f vmlinux.relocs ] && echo "vmlinux.relocs can't be found, please remove vmlinux and try again") || true + +$(obj)/Image: vmlinux.relocs FORCE +else $(obj)/Image: vmlinux FORCE +endif $(call if_changed,objcopy) $(obj)/Image.gz: $(obj)/Image FORCE
To circumvent an issue where placing the relocations inside the init sections produces empty relocations, use --emit-relocs. But to avoid carrying those relocations in vmlinux, use an intermediate vmlinux.relocs file which is a copy of vmlinux *before* stripping its relocations. Suggested-by: Björn Töpel <bjorn@kernel.org> Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com> --- arch/riscv/Makefile | 2 +- arch/riscv/Makefile.postlink | 13 +++++++++++++ arch/riscv/boot/Makefile | 7 +++++++ 3 files changed, 21 insertions(+), 1 deletion(-)