a008c1
#! /bin/bash
a008c1
a008c1
IFS=$'\n'
a008c1
a008c1
for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz)?$'); do
a008c1
    tmpfile=""
a008c1
    if [ "x${module%.ko}" = "x${module}" ]; then
a008c1
        tmpfile=$(mktemp -t ${0##*/}.XXXXXX.ko)
a008c1
        proc_bin=
a008c1
        case "${module##*.}" in
a008c1
        xz)
a008c1
                proc_bin=xz
a008c1
                ;;
a008c1
        bz2)
a008c1
                proc_bin=bzip2
a008c1
                ;;
a008c1
        gz)
a008c1
                proc_bin=gzip
a008c1
                ;;
a008c1
        esac
a008c1
a008c1
        [ -n "$proc_bin" ] || continue
a008c1
a008c1
        "$proc_bin" -d -c - < "$module" > "$tmpfile" || continue
a008c1
        module="$tmpfile"
a008c1
    fi
a008c1
a008c1
    if [[ -n $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
a008c1
        nm $module \
a008c1
        | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
a008c1
        | awk --non-decimal-data '{printf("ksym(%s) = 0x%08x\n", $2, $1)}' \
a008c1
        | LC_ALL=C sort -u
a008c1
    else
a008c1
        ELFRODATA=$(readelf -R .rodata $module | awk '/0x/{printf $2$3$4$5}')
a008c1
        if [[ -n $(readelf -h $module | grep "little endian") ]]; then
a008c1
            RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')
a008c1
        else
a008c1
            RODATA=$ELFRODATA
a008c1
        fi
a008c1
        for sym in $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do
a008c1
            echo $sym $RODATA
a008c1
        done \
a008c1
        | awk --non-decimal-data '{printf("ksym(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \
a008c1
        | LC_ALL=C sort -u
a008c1
    fi
a008c1
a008c1
    [ -z "$tmpfile" ] || rm -f -- "$tmpfile"
a008c1
done