Blame klp-symbols

Bernhard M. Wiedemann 6ebc4a
#!/bin/bash
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
set -e
Bernhard M. Wiedemann 6ebc4a
export LC_COLLATE=C
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
usage()
Bernhard M. Wiedemann 6ebc4a
{
Bernhard M. Wiedemann 6ebc4a
	echo "Tool to generate list of symbols that are used to build kernel livepatches"
Bernhard M. Wiedemann 6ebc4a
	echo
Bernhard M. Wiedemann 6ebc4a
	echo "Usage: ${0##*/} kernel_build_dir klp_symbols"
Bernhard M. Wiedemann 6ebc4a
	echo "  kernel_build_dir    Directory where to find the built kernel binaries"
Bernhard M. Wiedemann 6ebc4a
	echo "  klp_symbols         Output file with the list of symbols"
Bernhard M. Wiedemann 6ebc4a
}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
if test "$1" == "-h" -o "$1" == "--help" -o $# -ne 2 ; then
Bernhard M. Wiedemann 6ebc4a
	usage >&2
Bernhard M. Wiedemann 6ebc4a
	exit 1
Bernhard M. Wiedemann 6ebc4a
fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
KLP_DATA_VERSION="0.1"
Bernhard M. Wiedemann 6ebc4a
KERNEL_BUILD_DIR="$1"
Bernhard M. Wiedemann 6ebc4a
KLP_SYMBOLS="$2"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
VMLINUX="$KERNEL_BUILD_DIR/vmlinux"
Bernhard M. Wiedemann 6ebc4a
MODVER_DIR="$KERNEL_BUILD_DIR/.tmp_versions"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
if ! test -f "$VMLINUX" ; then
Bernhard M. Wiedemann 6ebc4a
	echo "Error: Cannot open file: $VMLINUX" >&2
Bernhard M. Wiedemann 6ebc4a
	exit 1
Bernhard M. Wiedemann 6ebc4a
fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
if ! test -d "$MODVER_DIR" ; then
Bernhard M. Wiedemann 6ebc4a
	# kernel >= 5.3 has *.mod in the build tree
Bernhard M. Wiedemann 6ebc4a
	mod_cnt=$(find "$KERNEL_BUILD_DIR" -name '*.mod' | wc -l)
Bernhard M. Wiedemann 6ebc4a
	if [ $mod_cnt -eq 0 ]; then
Bernhard M. Wiedemann 6ebc4a
		echo "Error: Directory does not exist: $MODVER_DIR" >&2
Bernhard M. Wiedemann 6ebc4a
		exit 1
Bernhard M. Wiedemann 6ebc4a
	fi
Bernhard M. Wiedemann 6ebc4a
	MODVER_DIR="$KERNEL_BUILD_DIR"
Bernhard M. Wiedemann 6ebc4a
fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
get_symbols()
Bernhard M. Wiedemann 6ebc4a
{
Bernhard M. Wiedemann 6ebc4a
	nm -f posix "$1" | grep -v '\( [UN] \)\|\(\.L\|__crc_\)' | cut -d\  -f1
Bernhard M. Wiedemann 6ebc4a
}
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
echo "klp-convert-symbol-data.$KLP_DATA_VERSION" > "$KLP_SYMBOLS"
Bernhard M. Wiedemann 6ebc4a
echo "*vmlinux" >> "$KLP_SYMBOLS"
Bernhard M. Wiedemann 6ebc4a
get_symbols "$VMLINUX" >> "$KLP_SYMBOLS"
Bernhard M. Wiedemann 6ebc4a
bd7477
find "$MODVER_DIR" -iname '*.mod' | sort | while read KMOD ; do
Bernhard M. Wiedemann 6ebc4a
    if [ "$MODVER_DIR" = "$KERNEL_BUILD_DIR" ]; then
Bernhard M. Wiedemann 6ebc4a
        # kernel >= 5.3, just replace the suffix
Bernhard M. Wiedemann 6ebc4a
        KO_FILE="${KMOD%.mod}.ko"
Bernhard M. Wiedemann 6ebc4a
    else
Bernhard M. Wiedemann 6ebc4a
        # kernel <= 5.2, read .ko path and file from .mod file
Bernhard M. Wiedemann 6ebc4a
        KO_FILE="$(head -n1 $KMOD)"
Bernhard M. Wiedemann 6ebc4a
    fi
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    # obtain module name and its object file by processing .ko file name
Bernhard M. Wiedemann 6ebc4a
    NO_SUFFIX="$(basename -s .ko $KO_FILE)"
Bernhard M. Wiedemann 6ebc4a
    KMOD_NAME="$(echo $NO_SUFFIX | sed 's/-/_/g')"
Bernhard M. Wiedemann 6ebc4a
    OBJ_FILE="$(dirname $KO_FILE)/$NO_SUFFIX.o"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    # write module name to Symbols file
Bernhard M. Wiedemann 6ebc4a
    echo "*$KMOD_NAME" >> "$KLP_SYMBOLS"
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
    # extract symbols from object file and write them to Symbols file
Bernhard M. Wiedemann 6ebc4a
    get_symbols "$OBJ_FILE" >> "$KLP_SYMBOLS"
Bernhard M. Wiedemann 6ebc4a
done
Bernhard M. Wiedemann 6ebc4a
Bernhard M. Wiedemann 6ebc4a
exit 0