Skip to content

Commit

Permalink
powerpc: Do not consider weak unresolved symbol relocations as bad
Browse files Browse the repository at this point in the history
Commit 8580ac9 ("bpf: Process in-kernel BTF") introduced two weak
symbols that may be unresolved at link time which result in an absolute
relocation to 0. relocs_check.sh emits the following warning:

"WARNING: 2 bad relocations
c000000001a41478 R_PPC64_ADDR64    _binary__btf_vmlinux_bin_start
c000000001a41480 R_PPC64_ADDR64    _binary__btf_vmlinux_bin_end"

whereas those relocations are legitimate even for a relocatable kernel
compiled with -pie option.

relocs_check.sh already excluded some weak unresolved symbols explicitly:
remove those hardcoded symbols and add some logic that parses the symbols
using nm, retrieves all the weak unresolved symbols and excludes those from
the list of the potential bad relocations.

Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200118170335.21440-1-alex@ghiti.fr
  • Loading branch information
Alexandre Ghiti authored and Michael Ellerman committed Jan 31, 2020
1 parent 4119622 commit 43e76cd
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 10 deletions.
4 changes: 2 additions & 2 deletions arch/powerpc/Makefile.postlink
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ quiet_cmd_head_check = CHKHEAD $@
quiet_cmd_relocs_check = CHKREL $@
ifdef CONFIG_PPC_BOOK3S_64
cmd_relocs_check = \
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$@" ; \
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@" ; \
$(BASH) $(srctree)/arch/powerpc/tools/unrel_branch_check.sh "$(OBJDUMP)" "$@"
else
cmd_relocs_check = \
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$@"
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@"
endif

# `@true` prevents complaint when there is nothing to be done
Expand Down
20 changes: 12 additions & 8 deletions arch/powerpc/tools/relocs_check.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,21 @@
# based on relocs_check.pl
# Copyright © 2009 IBM Corporation

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

# Have Kbuild supply the path to objdump so we handle cross compilation.
# Have Kbuild supply the path to objdump and nm so we handle cross compilation.
objdump="$1"
vmlinux="$2"
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" |
Expand All @@ -26,8 +33,6 @@ $objdump -R "$vmlinux" |
# These relocations are okay
# On PPC64:
# R_PPC64_RELATIVE, R_PPC64_NONE
# R_PPC64_ADDR64 mach_<name>
# R_PPC64_ADDR64 __crc_<name>
# On PPC:
# R_PPC_RELATIVE, R_PPC_ADDR16_HI,
# R_PPC_ADDR16_HA,R_PPC_ADDR16_LO,
Expand All @@ -39,8 +44,7 @@ R_PPC_ADDR16_HI
R_PPC_ADDR16_HA
R_PPC_RELATIVE
R_PPC_NONE' |
grep -E -v '\<R_PPC64_ADDR64[[:space:]]+mach_' |
grep -E -v '\<R_PPC64_ADDR64[[:space:]]+__crc_'
([ "$undef_weak_symbols" ] && grep -F -w -v "$undef_weak_symbols" || cat)
)

if [ -z "$bad_relocs" ]; then
Expand Down

0 comments on commit 43e76cd

Please sign in to comment.