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