Viewing: find-provides.ksyms

#!/usr/bin/bash
# SPDX-License-Identifier: GPL-2.0

#
# This file is part of Lustre, http://www.lustre.org/
#
# rpm/find-provides.ksyms
#
# Find which kernel symbols a particular module provides
#

IFS=$'\n'

MODULE_SYMVERS=$RPM_BUILD_ROOT/Module.symvers

for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz)?$'); do
    tmpfile=""
    if [ "x${module%.ko}" = "x${module}" ]; then
        tmpfile=$(mktemp -t ${0##*/}.XXXXXX.ko)
        proc_bin=
        case "${module##*.}" in
        xz)
                proc_bin=xz
                ;;
        bz2)
                proc_bin=bzip2
                ;;
        gz)
                proc_bin=gzip
                ;;
        esac

        [ -n "$proc_bin" ] || continue

        "$proc_bin" -d -c - < "$module" > "$tmpfile" || continue
        module="$tmpfile"
    fi

    if [[ -f $MODULE_SYMVERS ]] ; then
        # all symbols prefixed with __rcr_ where the symbol is:
        #  A   - symbol is an absolute value
        #  D,d - symbol is in the initialized data section
        #  R,r - symbol is in the read-only data section
        #  T,t - symbol is in the text (code) section
        for sym in $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) [ADdRr] __crc_(.+):\2:p'); do
            grep -w $sym $MODULE_SYMVERS | awk '{printf("ksym(%s) = %08s\n", $2, $1)}'
        done \
        | LC_ALL=C sort -u
    else
        >&2 echo "Module.symvers required for provides."
    fi
    [ -z "$tmpfile" ] || rm -f -- "$tmpfile"
done