On Sun, May 24, 2020 at 2:26 PM Alexandre Ghiti <a...@ghiti.fr> wrote: > > 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. > > Powerpc architecture has a script that allows to check at compile time > for such unexpected relocations: extract the common logic to scripts/ > and add arch specific scripts triggered at postlink. > > At the moment, powerpc and riscv architectures take advantage of this > compile-time check. > > Signed-off-by: Alexandre Ghiti <a...@ghiti.fr> > --- > arch/powerpc/tools/relocs_check.sh | 18 ++------------- > arch/riscv/Makefile.postlink | 36 ++++++++++++++++++++++++++++++ > arch/riscv/tools/relocs_check.sh | 26 +++++++++++++++++++++ > scripts/relocs_check.sh | 20 +++++++++++++++++ > 4 files changed, 84 insertions(+), 16 deletions(-) > create mode 100644 arch/riscv/Makefile.postlink > create mode 100755 arch/riscv/tools/relocs_check.sh > create mode 100755 scripts/relocs_check.sh
Maybe you should send the change arch/powerpc/tools/relocs_check.sh as a separate patch so that it can be picked up by arch/powerpc maintainers. > > diff --git a/arch/powerpc/tools/relocs_check.sh > b/arch/powerpc/tools/relocs_check.sh > index 014e00e74d2b..e367895941ae 100755 > --- a/arch/powerpc/tools/relocs_check.sh > +++ b/arch/powerpc/tools/relocs_check.sh > @@ -15,21 +15,8 @@ if [ $# -lt 3 ]; then > exit 1 > fi > > -# Have Kbuild supply the path to objdump and nm so we handle cross > compilation. > -objdump="$1" > -nm="$2" > -vmlinux="$3" > - > -# Remove from the bad relocations those that match an undefined weak symbol > -# which will result in an absolute relocation to 0. > -# Weak unresolved symbols are of that form in nm output: > -# " w _binary__btf_vmlinux_bin_end" > -undef_weak_symbols=$($nm "$vmlinux" | awk '$1 ~ /w/ { print $2 }') > - > bad_relocs=$( > -$objdump -R "$vmlinux" | > - # Only look at relocation lines. > - grep -E '\<R_' | > +${srctree}/scripts/relocs_check.sh "$@" | > # These relocations are okay > # On PPC64: > # R_PPC64_RELATIVE, R_PPC64_NONE > @@ -43,8 +30,7 @@ R_PPC_ADDR16_LO > R_PPC_ADDR16_HI > R_PPC_ADDR16_HA > R_PPC_RELATIVE > -R_PPC_NONE' | > - ([ "$undef_weak_symbols" ] && grep -F -w -v "$undef_weak_symbols" || > cat) > +R_PPC_NONE' > ) > > if [ -z "$bad_relocs" ]; then > diff --git a/arch/riscv/Makefile.postlink b/arch/riscv/Makefile.postlink > new file mode 100644 > index 000000000000..bf2b2bca1845 > --- /dev/null > +++ b/arch/riscv/Makefile.postlink > @@ -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 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) > diff --git a/arch/riscv/tools/relocs_check.sh > b/arch/riscv/tools/relocs_check.sh > new file mode 100755 > index 000000000000..baeb2e7b2290 > --- /dev/null > +++ b/arch/riscv/tools/relocs_check.sh > @@ -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" > diff --git a/scripts/relocs_check.sh b/scripts/relocs_check.sh > new file mode 100755 > index 000000000000..137c660499f3 > --- /dev/null > +++ b/scripts/relocs_check.sh > @@ -0,0 +1,20 @@ > +#!/bin/sh > +# SPDX-License-Identifier: GPL-2.0-or-later > + > +# Get a list of all the relocations, remove from it the relocations > +# that are known to be legitimate and return this list to arch specific > +# script that will look for suspicious relocations. > + > +objdump="$1" > +nm="$2" > +vmlinux="$3" > + > +# Remove from the possible bad relocations those that match an undefined > +# weak symbol which will result in an absolute relocation to 0. > +# Weak unresolved symbols are of that form in nm output: > +# " w _binary__btf_vmlinux_bin_end" > +undef_weak_symbols=$($nm "$vmlinux" | awk '$1 ~ /w/ { print $2 }') > + > +$objdump -R "$vmlinux" | > + grep -E '\<R_' | > + ([ "$undef_weak_symbols" ] && grep -F -w -v "$undef_weak_symbols" || > cat) > -- > 2.20.1 > Otherwise, looks good to me. Reviewed-by: Anup Patel <a...@brainfault.org> Regards, Anup