Blame SOURCES/find-requires.ksyms

6fefcb
#! /bin/bash
6fefcb
6fefcb
IFS=$'\n'
6fefcb
6fefcb
all_provides() {
6fefcb
    nm "$@" \
6fefcb
    | sed -r -ne 's:^([0-9a-f]+) A __crc_(.+):\1\t\2:p' \
6fefcb
    | sort -k2 -u
6fefcb
}
6fefcb
6fefcb
all_requires() {
6fefcb
    for module in "$@"; do
6fefcb
        set -- $(/sbin/modinfo -F vermagic "$module" | sed -e 's: .*::' -e q)
6fefcb
        /sbin/modprobe --dump-modversions "$module" \
6fefcb
        | awk --non-decimal-data '
6fefcb
            BEGIN { FS = "\t" ; OFS = "\t" }
6fefcb
            {printf("0x%08x\t%s\n", $1, $2)}' \
6fefcb
        | sed -r -e 's:$:\t'"$1"':'
6fefcb
    done \
6fefcb
    | sort -k2 -u
6fefcb
}
6fefcb
6fefcb
rm -rf /tmp/krava
6fefcb
6fefcb
if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then
6fefcb
    cat > /dev/null
6fefcb
    exit 0
6fefcb
fi
6fefcb
6fefcb
modules=($(grep -E '/lib/modules/.+\.ko$'))
6fefcb
6fefcb
if [ ${#modules[@]} -gt 0 ]; then
6fefcb
    kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q)
6fefcb
6fefcb
    # get all that kernel provides
6fefcb
    symvers=$(mktemp -t ${0##*/}.XXXXX)
6fefcb
    cat /usr/src/kernels/$kernel/Module.symvers | awk '
6fefcb
        BEGIN { FS = "\t" ; OFS = "\t" }
6fefcb
        { print $2 "\t" $1 }
6fefcb
    ' \
6fefcb
    | sed -r -e 's:$:\t'"$1"':' \
6fefcb
    | sort -u -k2 > $symvers
6fefcb
6fefcb
    # get all that we demands
6fefcb
    reqs=$(mktemp -t ${0##*/}.XXXXX)
6fefcb
    join -t $'\t' -j 2 -v 1 \
6fefcb
            <(all_requires "${modules[@]}") \
6fefcb
            <(all_provides "${modules[@]}") \
6fefcb
    | sort -u -k2 > $reqs
6fefcb
6fefcb
    # get kernel dependencies - kernel(symbol) = 0xHEX
6fefcb
    join -t $'\t' -j2 -o 1.1 1.2 $symvers $reqs \
6fefcb
    | sort -u \
6fefcb
    | awk '
6fefcb
    { FS = "\t" ; OFS = "\t" }
6fefcb
            { print "kernel(" $1 ") = " $2 }
6fefcb
    '
6fefcb
6fefcb
    # get module dependencies - ksym(symbol) = 0xHEX
6fefcb
    join -t $'\t' -j2 -v2 $symvers $reqs \
6fefcb
    | sort -u | awk '
6fefcb
    { FS = "\t" ; OFS = "\t" }
6fefcb
            { print "ksym(" $2 ") = " $1 }
6fefcb
    '
6fefcb
fi