Add support for compressed kernel modules
- Add support for compressed kernel modules to find-provides.ksyms, find-requires.ksyms, firmware.prov (#1622019) * find-provides.ksyms: Try to process files whose names end with something else than "*.ko" by guessing a decompressor and uncompressing it in a temporary file and parsing it instead. * find-requires.ksyms (all_provides): Likewise. Add "(\.gz|\.bz2|\.xz)?" to the end of the module path matching regular expression. * firmware.prov: Add "(\.gz|\.bz2|\.xz)?" to the end of the module path matching regular expression. Resolves: #1942537 Signed-off-by: Eugene Syromiatnikov <esyr@redhat.com>
This commit is contained in:
parent
6b98812de6
commit
40474999ce
@ -2,7 +2,29 @@
|
|||||||
|
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
|
|
||||||
for module in $(grep -E '/lib/modules/.+\.ko$'); do
|
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 [[ -n $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
|
if [[ -n $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
|
||||||
nm $module \
|
nm $module \
|
||||||
| sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
|
| sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
|
||||||
@ -21,4 +43,6 @@ for module in $(grep -E '/lib/modules/.+\.ko$'); do
|
|||||||
| awk --non-decimal-data '{printf("ksym(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \
|
| awk --non-decimal-data '{printf("ksym(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \
|
||||||
| LC_ALL=C sort -u
|
| LC_ALL=C sort -u
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
[ -z "$tmpfile" ] || rm -f -- "$tmpfile"
|
||||||
done
|
done
|
||||||
|
@ -9,24 +9,49 @@ IFS=$'\n'
|
|||||||
|
|
||||||
# Extract all of the symbols provided by this module.
|
# Extract all of the symbols provided by this module.
|
||||||
all_provides() {
|
all_provides() {
|
||||||
if [[ -n $(nm "$@" | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
|
for module in "$@"; do
|
||||||
nm "$@" \
|
tmpfile=""
|
||||||
| sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
|
if [ "x${module%.ko}" = "x${module}" ]; then
|
||||||
| awk --non-decimal-data '{printf("%s:0x%08x\n", $2, $1)}' \
|
tmpfile=$(mktemp -t ${0##*/}.XXXXXX.ko)
|
||||||
| LC_ALL=C sort -k1,1 -u
|
proc_bin=
|
||||||
else
|
case "${module##*.}" in
|
||||||
ELFRODATA=$(readelf -R .rodata "$@" | awk '/0x/{printf $2$3$4$5}')
|
xz)
|
||||||
if [[ -n $(readelf -h "$@" | grep "little endian") ]]; then
|
proc_bin=xz
|
||||||
RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')
|
;;
|
||||||
else
|
bz2)
|
||||||
RODATA=$ELFRODATA
|
proc_bin=bzip2
|
||||||
|
;;
|
||||||
|
gz)
|
||||||
|
proc_bin=gzip
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[ -n "$proc_bin" ] || continue
|
||||||
|
|
||||||
|
"$proc_bin" -d -c - < "$module" > "$tmpfile" || continue
|
||||||
|
module="$tmpfile"
|
||||||
fi
|
fi
|
||||||
for sym in $(nm "$@" | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do
|
|
||||||
echo $sym $RODATA
|
if [[ -n $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then
|
||||||
done \
|
nm "$module" \
|
||||||
| awk --non-decimal-data '{printf("%s:0x%08s\n", $2, substr($3,($1*2)+1,8))}' \
|
| sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \
|
||||||
| LC_ALL=C sort -k1,1 -u
|
| awk --non-decimal-data '{printf("%s:0x%08x\n", $2, $1)}'
|
||||||
fi
|
else
|
||||||
|
ELFRODATA=$(readelf -R .rodata "$module" | awk '/0x/{printf $2$3$4$5}')
|
||||||
|
if [[ -n $(readelf -h "$module" | grep "little endian") ]]; then
|
||||||
|
RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')
|
||||||
|
else
|
||||||
|
RODATA=$ELFRODATA
|
||||||
|
fi
|
||||||
|
for sym in $(nm "$module" | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do
|
||||||
|
echo $sym $RODATA
|
||||||
|
done \
|
||||||
|
| awk --non-decimal-data '{printf("%s:0x%08s\n", $2, substr($3,($1*2)+1,8))}'
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -z "$tmpfile" ] || rm -f -- "$tmpfile"
|
||||||
|
done \
|
||||||
|
| LC_ALL=C sort -k1,1 -u
|
||||||
}
|
}
|
||||||
|
|
||||||
# Extract all of the requirements of this module.
|
# Extract all of the requirements of this module.
|
||||||
@ -98,7 +123,7 @@ check_kabi() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
modules=($(grep -E '/lib/modules/.+\.ko$'))
|
modules=($(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz)?$'))
|
||||||
if [ ${#modules[@]} -gt 0 ]; then
|
if [ ${#modules[@]} -gt 0 ]; then
|
||||||
kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q)
|
kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q)
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
|
|
||||||
for module in $(grep -E '/lib/modules/.+\.ko$') $*;
|
for module in $(grep -E '/lib/modules/.+\.ko(\.gz|\.bz2|\.xz)?$') $*;
|
||||||
do
|
do
|
||||||
for firmware in `/sbin/modinfo -F firmware $module`;
|
for firmware in `/sbin/modinfo -F firmware $module`;
|
||||||
do
|
do
|
||||||
|
Loading…
Reference in New Issue
Block a user