mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
kbuild: do not include include/config/auto.conf from shell scripts
Richard Weinberger pointed out the risk of sourcing the kernel config from shell scripts [1], and proposed some patches [2], [3]. It is a good point, but it took a long time because I was wondering how to fix this. This commit goes with simple grep approach because there are only a few scripts including the kernel configuration. scripts/link_vmlinux.sh has references to a bunch of CONFIG options, all of which are boolean. I added is_enabled() helper as scripts/package/{mkdebian,builddeb} do. scripts/gen_autoksyms.sh uses 'eval', stating "to expand the whitelist path". I removed it since it is the issue we are trying to fix. I was a bit worried about the cost of invoking the grep command over again. I extracted the grep parts from it, and measured the cost. It was approximately 0.03 sec, which I hope is acceptable. [test code] $ cat test-grep.sh #!/bin/sh is_enabled() { grep -q "^$1=y" include/config/auto.conf } is_enabled CONFIG_LTO_CLANG is_enabled CONFIG_LTO_CLANG is_enabled CONFIG_STACK_VALIDATION is_enabled CONFIG_UNWINDER_ORC is_enabled CONFIG_FTRACE_MCOUNT_USE_OBJTOOL is_enabled CONFIG_VMLINUX_VALIDATION is_enabled CONFIG_FRAME_POINTER is_enabled CONFIG_GCOV_KERNEL is_enabled CONFIG_LTO_CLANG is_enabled CONFIG_RETPOLINE is_enabled CONFIG_X86_SMAP is_enabled CONFIG_LTO_CLANG is_enabled CONFIG_VMLINUX_MAP is_enabled CONFIG_KALLSYMS_ALL is_enabled CONFIG_KALLSYMS_ABSOLUTE_PERCPU is_enabled CONFIG_KALLSYMS_BASE_RELATIVE is_enabled CONFIG_DEBUG_INFO_BTF is_enabled CONFIG_KALLSYMS is_enabled CONFIG_DEBUG_INFO_BTF is_enabled CONFIG_BPF is_enabled CONFIG_BUILDTIME_TABLE_SORT is_enabled CONFIG_KALLSYMS $ time ./test-grep.sh real 0m0.036s user 0m0.027s sys m0.009s [1]: https://lore.kernel.org/all/1919455.eZKeABUfgV@blindfold/ [2]: https://lore.kernel.org/all/20180219092245.26404-1-richard@nod.at/ [3]: https://lore.kernel.org/all/20210920213957.1064-2-richard@nod.at/ Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Nicolas Schier <n.schier@avm.de>
This commit is contained in:
parent
b8c96a6b46
commit
7d153696e5
@ -16,20 +16,15 @@ case "$KBUILD_VERBOSE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# We need access to CONFIG_ symbols
|
||||
. include/config/auto.conf
|
||||
|
||||
needed_symbols=
|
||||
|
||||
# Special case for modversions (see modpost.c)
|
||||
if [ -n "$CONFIG_MODVERSIONS" ]; then
|
||||
if grep -q "^CONFIG_MODVERSIONS=y$" include/config/auto.conf; then
|
||||
needed_symbols="$needed_symbols module_layout"
|
||||
fi
|
||||
|
||||
ksym_wl=
|
||||
if [ -n "$CONFIG_UNUSED_KSYMS_WHITELIST" ]; then
|
||||
# Use 'eval' to expand the whitelist path and check if it is relative
|
||||
eval ksym_wl="$CONFIG_UNUSED_KSYMS_WHITELIST"
|
||||
ksym_wl=$(sed -n 's/^CONFIG_UNUSED_KSYMS_WHITELIST="\(.*\)"$/\1/p' include/config/auto.conf)
|
||||
if [ -n "$ksym_wl" ]; then
|
||||
[ "${ksym_wl}" != "${ksym_wl#/}" ] || ksym_wl="$abs_srctree/$ksym_wl"
|
||||
if [ ! -f "$ksym_wl" ] || [ ! -r "$ksym_wl" ]; then
|
||||
echo "ERROR: '$ksym_wl' whitelist file not found" >&2
|
||||
|
@ -34,6 +34,10 @@ LD="$1"
|
||||
KBUILD_LDFLAGS="$2"
|
||||
LDFLAGS_vmlinux="$3"
|
||||
|
||||
is_enabled() {
|
||||
grep -q "^$1=y" include/config/auto.conf
|
||||
}
|
||||
|
||||
# Nice output in kbuild format
|
||||
# Will be supressed by "make -s"
|
||||
info()
|
||||
@ -80,11 +84,11 @@ modpost_link()
|
||||
${KBUILD_VMLINUX_LIBS} \
|
||||
--end-group"
|
||||
|
||||
if [ -n "${CONFIG_LTO_CLANG}" ]; then
|
||||
if is_enabled CONFIG_LTO_CLANG; then
|
||||
gen_initcalls
|
||||
lds="-T .tmp_initcalls.lds"
|
||||
|
||||
if [ -n "${CONFIG_MODVERSIONS}" ]; then
|
||||
if is_enabled CONFIG_MODVERSIONS; then
|
||||
gen_symversions
|
||||
lds="${lds} -T .tmp_symversions.lds"
|
||||
fi
|
||||
@ -104,21 +108,21 @@ objtool_link()
|
||||
local objtoolcmd;
|
||||
local objtoolopt;
|
||||
|
||||
if [ "${CONFIG_LTO_CLANG} ${CONFIG_STACK_VALIDATION}" = "y y" ]; then
|
||||
if is_enabled CONFIG_LTO_CLANG && is_enabled CONFIG_STACK_VALIDATION; then
|
||||
# Don't perform vmlinux validation unless explicitly requested,
|
||||
# but run objtool on vmlinux.o now that we have an object file.
|
||||
if [ -n "${CONFIG_UNWINDER_ORC}" ]; then
|
||||
if is_enabled CONFIG_UNWINDER_ORC; then
|
||||
objtoolcmd="orc generate"
|
||||
fi
|
||||
|
||||
objtoolopt="${objtoolopt} --duplicate"
|
||||
|
||||
if [ -n "${CONFIG_FTRACE_MCOUNT_USE_OBJTOOL}" ]; then
|
||||
if is_enabled CONFIG_FTRACE_MCOUNT_USE_OBJTOOL; then
|
||||
objtoolopt="${objtoolopt} --mcount"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then
|
||||
if is_enabled CONFIG_VMLINUX_VALIDATION; then
|
||||
objtoolopt="${objtoolopt} --noinstr"
|
||||
fi
|
||||
|
||||
@ -127,16 +131,16 @@ objtool_link()
|
||||
objtoolcmd="check"
|
||||
fi
|
||||
objtoolopt="${objtoolopt} --vmlinux"
|
||||
if [ -z "${CONFIG_FRAME_POINTER}" ]; then
|
||||
if ! is_enabled CONFIG_FRAME_POINTER; then
|
||||
objtoolopt="${objtoolopt} --no-fp"
|
||||
fi
|
||||
if [ -n "${CONFIG_GCOV_KERNEL}" ] || [ -n "${CONFIG_LTO_CLANG}" ]; then
|
||||
if is_enabled CONFIG_GCOV_KERNEL || is_enabled CONFIG_LTO_CLANG; then
|
||||
objtoolopt="${objtoolopt} --no-unreachable"
|
||||
fi
|
||||
if [ -n "${CONFIG_RETPOLINE}" ]; then
|
||||
if is_enabled CONFIG_RETPOLINE; then
|
||||
objtoolopt="${objtoolopt} --retpoline"
|
||||
fi
|
||||
if [ -n "${CONFIG_X86_SMAP}" ]; then
|
||||
if is_enabled CONFIG_X86_SMAP; then
|
||||
objtoolopt="${objtoolopt} --uaccess"
|
||||
fi
|
||||
info OBJTOOL ${1}
|
||||
@ -161,7 +165,7 @@ vmlinux_link()
|
||||
# skip output file argument
|
||||
shift
|
||||
|
||||
if [ -n "${CONFIG_LTO_CLANG}" ]; then
|
||||
if is_enabled CONFIG_LTO_CLANG; then
|
||||
# Use vmlinux.o instead of performing the slow LTO link again.
|
||||
objs=vmlinux.o
|
||||
libs=
|
||||
@ -189,7 +193,7 @@ vmlinux_link()
|
||||
ldflags="${ldflags} ${wl}--strip-debug"
|
||||
fi
|
||||
|
||||
if [ -n "${CONFIG_VMLINUX_MAP}" ]; then
|
||||
if is_enabled CONFIG_VMLINUX_MAP; then
|
||||
ldflags="${ldflags} ${wl}-Map=${output}.map"
|
||||
fi
|
||||
|
||||
@ -239,15 +243,15 @@ kallsyms()
|
||||
{
|
||||
local kallsymopt;
|
||||
|
||||
if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
|
||||
if is_enabled CONFIG_KALLSYMS_ALL; then
|
||||
kallsymopt="${kallsymopt} --all-symbols"
|
||||
fi
|
||||
|
||||
if [ -n "${CONFIG_KALLSYMS_ABSOLUTE_PERCPU}" ]; then
|
||||
if is_enabled CONFIG_KALLSYMS_ABSOLUTE_PERCPU; then
|
||||
kallsymopt="${kallsymopt} --absolute-percpu"
|
||||
fi
|
||||
|
||||
if [ -n "${CONFIG_KALLSYMS_BASE_RELATIVE}" ]; then
|
||||
if is_enabled CONFIG_KALLSYMS_BASE_RELATIVE; then
|
||||
kallsymopt="${kallsymopt} --base-relative"
|
||||
fi
|
||||
|
||||
@ -312,9 +316,6 @@ if [ "$1" = "clean" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# We need access to CONFIG_ symbols
|
||||
. include/config/auto.conf
|
||||
|
||||
# Update version
|
||||
info GEN .version
|
||||
if [ -r .version ]; then
|
||||
@ -343,7 +344,7 @@ tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' |
|
||||
tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin
|
||||
|
||||
btf_vmlinux_bin_o=""
|
||||
if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then
|
||||
if is_enabled CONFIG_DEBUG_INFO_BTF; then
|
||||
btf_vmlinux_bin_o=.btf.vmlinux.bin.o
|
||||
if ! gen_btf .tmp_vmlinux.btf $btf_vmlinux_bin_o ; then
|
||||
echo >&2 "Failed to generate BTF for vmlinux"
|
||||
@ -355,7 +356,7 @@ fi
|
||||
kallsymso=""
|
||||
kallsymso_prev=""
|
||||
kallsyms_vmlinux=""
|
||||
if [ -n "${CONFIG_KALLSYMS}" ]; then
|
||||
if is_enabled CONFIG_KALLSYMS; then
|
||||
|
||||
# kallsyms support
|
||||
# Generate section listing all symbols and add it into vmlinux
|
||||
@ -395,12 +396,12 @@ fi
|
||||
vmlinux_link vmlinux "${kallsymso}" ${btf_vmlinux_bin_o}
|
||||
|
||||
# fill in BTF IDs
|
||||
if [ -n "${CONFIG_DEBUG_INFO_BTF}" -a -n "${CONFIG_BPF}" ]; then
|
||||
if is_enabled CONFIG_DEBUG_INFO_BTF && is_enabled CONFIG_BPF; then
|
||||
info BTFIDS vmlinux
|
||||
${RESOLVE_BTFIDS} vmlinux
|
||||
fi
|
||||
|
||||
if [ -n "${CONFIG_BUILDTIME_TABLE_SORT}" ]; then
|
||||
if is_enabled CONFIG_BUILDTIME_TABLE_SORT; then
|
||||
info SORTTAB vmlinux
|
||||
if ! sorttable vmlinux; then
|
||||
echo >&2 Failed to sort kernel tables
|
||||
@ -412,7 +413,7 @@ info SYSMAP System.map
|
||||
mksysmap vmlinux System.map
|
||||
|
||||
# step a (see comment above)
|
||||
if [ -n "${CONFIG_KALLSYMS}" ]; then
|
||||
if is_enabled CONFIG_KALLSYMS; then
|
||||
mksysmap ${kallsyms_vmlinux} .tmp_System.map
|
||||
|
||||
if ! cmp -s System.map .tmp_System.map; then
|
||||
|
@ -111,9 +111,7 @@ if $scm_only; then
|
||||
exit
|
||||
fi
|
||||
|
||||
if test -e include/config/auto.conf; then
|
||||
. include/config/auto.conf
|
||||
else
|
||||
if ! test -e include/config/auto.conf; then
|
||||
echo "Error: kernelrelease not valid - run 'make prepare' to update it" >&2
|
||||
exit 1
|
||||
fi
|
||||
@ -125,10 +123,11 @@ if test ! "$srctree" -ef .; then
|
||||
fi
|
||||
|
||||
# CONFIG_LOCALVERSION and LOCALVERSION (if set)
|
||||
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
|
||||
config_localversion=$(sed -n 's/^CONFIG_LOCALVERSION="\(.*\)"$/\1/p' include/config/auto.conf)
|
||||
res="${res}${config_localversion}${LOCALVERSION}"
|
||||
|
||||
# scm version string if not at a tagged commit
|
||||
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
|
||||
if grep -q "^CONFIG_LOCALVERSION_AUTO=y$" include/config/auto.conf; then
|
||||
# full scm version string
|
||||
res="$res$(scm_version)"
|
||||
elif [ "${LOCALVERSION+set}" != "set" ]; then
|
||||
|
Loading…
Reference in New Issue
Block a user