2015-03-18 08:46:16 +03:00
#!/bin/sh
2019-05-27 09:55:01 +03:00
# SPDX-License-Identifier: GPL-2.0-or-later
2015-03-18 08:46:16 +03:00
# Copyright © 2015 IBM Corporation
# This script checks the relocations of a vmlinux for "suspicious"
# relocations.
# based on relocs_check.pl
# Copyright © 2009 IBM Corporation
2020-01-18 20:03:35 +03:00
if [ $# -lt 3 ] ; then
echo " $0 [path to objdump] [path to nm] [path to vmlinux] " 1>& 2
2015-03-18 08:46:16 +03:00
exit 1
fi
2020-01-18 20:03:35 +03:00
# Have Kbuild supply the path to objdump and nm so we handle cross compilation.
2015-03-18 08:46:16 +03:00
objdump = " $1 "
2020-01-18 20:03:35 +03:00
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 }' )
2015-03-18 08:46:16 +03:00
bad_relocs = $(
2019-10-24 03:47:30 +03:00
$objdump -R " $vmlinux " |
2015-03-18 08:46:16 +03:00
# Only look at relocation lines.
grep -E '\<R_' |
# These relocations are okay
# On PPC64:
# R_PPC64_RELATIVE, R_PPC64_NONE
# On PPC:
# R_PPC_RELATIVE, R_PPC_ADDR16_HI,
# R_PPC_ADDR16_HA,R_PPC_ADDR16_LO,
# R_PPC_NONE
grep -F -w -v ' R_PPC64_RELATIVE
R_PPC64_NONE
R_PPC_ADDR16_LO
R_PPC_ADDR16_HI
R_PPC_ADDR16_HA
R_PPC_RELATIVE
R_PPC_NONE' |
2020-01-18 20:03:35 +03:00
( [ " $undef_weak_symbols " ] && grep -F -w -v " $undef_weak_symbols " || cat)
2015-03-18 08:46:16 +03:00
)
if [ -z " $bad_relocs " ] ; then
exit 0
fi
num_bad = $( echo " $bad_relocs " | wc -l)
echo " WARNING: $num_bad bad relocations "
echo " $bad_relocs "
# If we see this type of relocation it's an idication that
# we /may/ be using an old version of binutils.
if echo " $bad_relocs " | grep -q -F -w R_PPC64_UADDR64; then
echo "WARNING: You need at least binutils >= 2.19 to build a CONFIG_RELOCATABLE kernel"
fi