mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
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: Alexandre Ghiti <alex@ghiti.fr> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20230329045329.64565-6-alexghiti@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
parent
47981b5cc6
commit
c2dea0bc53
36
arch/riscv/Makefile.postlink
Normal file
36
arch/riscv/Makefile.postlink
Normal file
@ -0,0 +1,36 @@
|
||||
# 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
arch/riscv/tools/relocs_check.sh
Executable file
26
arch/riscv/tools/relocs_check.sh
Executable file
@ -0,0 +1,26 @@
|
||||
#!/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"
|
Loading…
Reference in New Issue
Block a user