Unverified Commit 559d1e45 authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Palmer Dabbelt
Browse files

riscv: Use --emit-relocs in order to move .rela.dyn in init



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: default avatarBjörn Töpel <bjorn@kernel.org>
Suggested-by: default avatarNick Desaulniers <ndesaulniers@google.com>
Signed-off-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
Link: https://lore.kernel.org/r/20230329045329.64565-7-alexghiti@rivosinc.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent c2dea0bc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
+13 −0
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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