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: 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>
This commit is contained in:
Родитель
c2dea0bc53
Коммит
559d1e45a1
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
OBJCOPYFLAGS := -O binary
|
OBJCOPYFLAGS := -O binary
|
||||||
ifeq ($(CONFIG_RELOCATABLE),y)
|
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
|
KBUILD_CFLAGS += -fPIE
|
||||||
endif
|
endif
|
||||||
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
|
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
|
||||||
|
|
|
@ -15,12 +15,25 @@ quiet_cmd_relocs_check = CHKREL $@
|
||||||
cmd_relocs_check = \
|
cmd_relocs_check = \
|
||||||
$(CONFIG_SHELL) $(srctree)/arch/riscv/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@"
|
$(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
|
# `@true` prevents complaint when there is nothing to be done
|
||||||
|
|
||||||
vmlinux: FORCE
|
vmlinux: FORCE
|
||||||
@true
|
@true
|
||||||
ifdef CONFIG_RELOCATABLE
|
ifdef CONFIG_RELOCATABLE
|
||||||
$(call if_changed,relocs_check)
|
$(call if_changed,relocs_check)
|
||||||
|
$(call if_changed,cp_vmlinux_relocs)
|
||||||
|
$(call if_changed,relocs_strip)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
%.ko: FORCE
|
%.ko: FORCE
|
||||||
|
|
|
@ -33,7 +33,14 @@ $(obj)/xipImage: vmlinux FORCE
|
||||||
|
|
||||||
endif
|
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
|
$(obj)/Image: vmlinux FORCE
|
||||||
|
endif
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
$(obj)/Image.gz: $(obj)/Image FORCE
|
$(obj)/Image.gz: $(obj)/Image FORCE
|
||||||
|
|
Загрузка…
Ссылка в новой задаче