riscv: Use --emit-relocs in order to move .rela.dyn in init
authorAlexandre Ghiti <alexghiti@rivosinc.com>
Wed, 29 Mar 2023 04:53:29 +0000 (06:53 +0200)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 19 Apr 2023 14:46:33 +0000 (07:46 -0700)
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>
Link: https://lore.kernel.org/r/20230329045329.64565-7-alexghiti@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/Makefile
arch/riscv/Makefile.postlink
arch/riscv/boot/Makefile

index 860b09e..7dc6904 100644 (file)
@@ -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)
index d5de8d5..a46fc57 100644 (file)
@@ -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
index c72de72..22b1394 100644 (file)
@@ -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