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

riscv: Check relocations at compile time



Relocating kernel at runtime is done very early in the boot process, so
it is not convenient to check for relocations there and react in case a
relocation was not expected.

There exists a script in scripts/ that extracts the relocations from
vmlinux that is then used at postlink to check the relocations.

Signed-off-by: default avatarAlexandre Ghiti <alex@ghiti.fr>
Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20230329045329.64565-6-alexghiti@rivosinc.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 47981b5c
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
# ===========================================================================
# Post-link riscv pass
# ===========================================================================
#
# Check that vmlinux relocations look sane

PHONY := __archpost
__archpost:

-include include/config/auto.conf
include $(srctree)/scripts/Kbuild.include

quiet_cmd_relocs_check = CHKREL  $@
cmd_relocs_check = 							\
	$(CONFIG_SHELL) $(srctree)/arch/riscv/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@"

# `@true` prevents complaint when there is nothing to be done

vmlinux: FORCE
	@true
ifdef CONFIG_RELOCATABLE
	$(call if_changed,relocs_check)
endif

%.ko: FORCE
	@true

clean:
	@true

PHONY += FORCE clean

FORCE:

.PHONY: $(PHONY)
+26 −0
Original line number Diff line number Diff line
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-or-later
# Based on powerpc relocs_check.sh

# This script checks the relocations of a vmlinux for "suspicious"
# relocations.

if [ $# -lt 3 ]; then
        echo "$0 [path to objdump] [path to nm] [path to vmlinux]" 1>&2
        exit 1
fi

bad_relocs=$(
${srctree}/scripts/relocs_check.sh "$@" |
	# These relocations are okay
	#	R_RISCV_RELATIVE
	grep -F -w -v 'R_RISCV_RELATIVE'
)

if [ -z "$bad_relocs" ]; then
	exit 0
fi

num_bad=$(echo "$bad_relocs" | wc -l)
echo "WARNING: $num_bad bad relocations"
echo "$bad_relocs"