mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 00:48:50 +00:00
850ded46c6
With CONFIG_LTO_CLANG, we currently link modules into native code just before modpost, which means with TRIM_UNUSED_KSYMS enabled, we still look at the LLVM bitcode in the .o files when generating the list of used symbols. As the bitcode doesn't yet have calls to compiler intrinsics and llvm-nm doesn't see function references that only exist in function-level inline assembly, we currently need a whitelist for TRIM_UNUSED_KSYMS to work with LTO. This change moves module LTO linking to happen earlier, and thus avoids the issue with LLVM bitcode and TRIM_UNUSED_KSYMS entirely, allowing us to also drop the whitelist from gen_autoksyms.sh. Link: https://github.com/ClangBuiltLinux/linux/issues/1369 Signed-off-by: Sami Tolvanen <samitolvanen@google.com> Reviewed-by: Alexander Lobakin <alobakin@pm.me> Tested-by: Alexander Lobakin <alobakin@pm.me> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
60 lines
1.5 KiB
Bash
Executable file
60 lines
1.5 KiB
Bash
Executable file
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
# Create an autoksyms.h header file from the list of all module's needed symbols
|
|
# as recorded on the second line of *.mod files and the user-provided symbol
|
|
# whitelist.
|
|
|
|
set -e
|
|
|
|
output_file="$1"
|
|
|
|
# Use "make V=1" to debug this script.
|
|
case "$KBUILD_VERBOSE" in
|
|
*1*)
|
|
set -x
|
|
;;
|
|
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
|
|
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}" != "${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
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Generate a new ksym list file with symbols needed by the current
|
|
# set of modules.
|
|
cat > "$output_file" << EOT
|
|
/*
|
|
* Automatically generated file; DO NOT EDIT.
|
|
*/
|
|
|
|
EOT
|
|
|
|
[ -f modules.order ] && modlist=modules.order || modlist=/dev/null
|
|
|
|
{
|
|
sed 's/ko$/mod/' $modlist | xargs -n1 sed -n -e '2p'
|
|
echo "$needed_symbols"
|
|
[ -n "$ksym_wl" ] && cat "$ksym_wl"
|
|
} | sed -e 's/ /\n/g' | sed -n -e '/^$/!p' |
|
|
# Remove the dot prefix for ppc64; symbol names with a dot (.) hold entry
|
|
# point addresses.
|
|
sed -e 's/^\.//' |
|
|
sort -u |
|
|
sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file"
|