Commit 93863f3f authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

kbuild: Check for functions with ambiguous -ffunction-sections section names



Commit 9c7dc1dd ("objtool: Warn on functions with ambiguous
-ffunction-sections section names") only works for drivers which are
compiled on architectures supported by objtool.

Make a script to perform the same check for all architectures.

Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://patch.msgid.link/a6a49644a34964f7e02f3a8ce43af03e72817180.1763669451.git.jpoimboe@kernel.org
parent 31863337
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@
 * .text.startup could be __attribute__((constructor)) code in a *non*
 * ffunction-sections object, which should be placed in .init.text; or it could
 * be an actual function named startup() in an ffunction-sections object, which
 * should be placed in .text.  Objtool will detect and complain about any such
 * should be placed in .text.  The build will detect and complain about any such
 * ambiguously named functions.
 */
#define TEXT_MAIN							\
+4 −0
Original line number Diff line number Diff line
@@ -63,11 +63,15 @@ quiet_cmd_ld_vmlinux.o = LD $@
	--start-group $(KBUILD_VMLINUX_LIBS) --end-group \
	$(cmd_objtool)

cmd_check_function_names = $(srctree)/scripts/check-function-names.sh $@

define rule_ld_vmlinux.o
	$(call cmd_and_savecmd,ld_vmlinux.o)
	$(call cmd,gen_objtooldep)
	$(call cmd,check_function_names)
endef


vmlinux.o: $(initcalls-lds) vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
	$(call if_changed_rule,ld_vmlinux.o)

+25 −0
Original line number Diff line number Diff line
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Certain function names are disallowed due to section name ambiguities
# introduced by -ffunction-sections.
#
# See the comment above TEXT_MAIN in include/asm-generic/vmlinux.lds.h.

objfile="$1"

if [ ! -f "$objfile" ]; then
	echo "usage: $0 <file.o>" >&2
	exit 1
fi

bad_symbols=$(nm "$objfile" | awk '$2 ~ /^[TtWw]$/ {print $3}' | grep -E '^(startup|exit|split|unlikely|hot|unknown)(\.|$)')

if [ -n "$bad_symbols" ]; then
	echo "$bad_symbols" | while read -r sym; do
		echo "$objfile: error: $sym() function name creates ambiguity with -ffunction-sections" >&2
	done
	exit 1
fi

exit 0