#26 Fix kernel ABI related scripts
Merged 6 years ago by pmatilai. Opened 6 years ago by poros.
rpms/ poros/redhat-rpm-config master  into  master

file modified
+20 -5
@@ -1,9 +1,24 @@ 

- #! /bin/sh

+ #! /bin/bash

  

  IFS=$'\n'

  

  for module in $(grep -E '/lib/modules/.+\.ko$'); do

-     nm $module \

-     | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):ksym(\2) = \1:p'

- done \

- | sort -u

+     if [[ -n $(nm $module | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then

why not if [ -n "$(…)" ] ?

+         nm $module \

+         | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \

+         | awk --non-decimal-data '{printf("ksym(%s) = 0x%08x\n", $2, $1)}' \

+         | LC_ALL=C sort -u

+     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("ksym(%s) = 0x%08s\n", $2, substr($3,($1*2)+1,8))}' \

+         | LC_ALL=C sort -u

+     fi

+ done

file modified
+51 -25
@@ -2,19 +2,47 @@ 

  

  IFS=$'\n'

  

+ # Extract all of the symbols provided by this module.

  all_provides() {

-     nm "$@" \

-     | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):\1\t\2:p' \

-     | sort -k2 -u

+     if [[ -n $(nm "$@" | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p') ]]; then

+         nm "$@" \

+         | sed -r -ne 's:^0*([0-9a-f]+) A __crc_(.+):0x\1 \2:p' \

+         | awk --non-decimal-data '{printf("0x%08x\t%s\n", $1, $2)}' \

+         | LC_ALL=C sort -k2,2 -u

+     else

+         ELFRODATA=$(readelf -R .rodata "$@" | awk '/0x/{printf $2$3$4$5}')

+         if [[ -n $(readelf -h "$@" | grep "little endian") ]]; then

+             RODATA=$(echo $ELFRODATA | sed 's/\(..\)\(..\)\(..\)\(..\)/\4\3\2\1/g')

+         else

+             RODATA=$ELFRODATA

+         fi

+         for sym in $(nm "$@" | sed -r -ne 's:^0*([0-9a-f]+) R __crc_(.+):0x\1 \2:p'); do

+             echo $sym $RODATA

+         done \

+         | awk --non-decimal-data '{printf("0x%08s\t%s\n", substr($3,($1*2)+1,8), $2)}' \

+         | LC_ALL=C sort -k2,2 -u

+     fi

  }

  

+ # Extract all of the requirements of this module.

  all_requires() {

      for module in "$@"; do

          set -- $(/sbin/modinfo -F vermagic "$module" | sed -e 's: .*::' -e q)

          /sbin/modprobe --dump-modversions "$module" \

-         | sed -r -e 's:^0x0*::' -e 's:$:\t'"$1"':'

+         | 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

+     | LC_ALL=C sort -k2,2 -u

+ }

+ 

+ # Filter out requirements fulfilled by the module itself.

+ mod_requires() {

+     LC_ALL=C join -t $'\t' -j 2 -v 1 \

+         <(all_requires "$@") \

+         <(all_provides "$@") \

+     | LC_ALL=C sort -k1,1 -u

  }

  

  if ! [ -e /sbin/modinfo -a -e /sbin/modprobe ]; then
@@ -24,25 +52,23 @@ 

  

  modules=($(grep -E '/lib/modules/.+\.ko$'))

  if [ ${#modules[@]} -gt 0 ]; then

-     symset_table=$(mktemp -t ${0##*/}.XXXXX)

-     /usr/lib/rpm/redhat/symset-table | sort > $symset_table

- 

-     join -t $'\t' -j 1 -a 2 $symset_table <(

-         # Filter out requirements that we fulfill ourself.

-         join -t $'\t' -j 2 -v 1 \

-             <(all_requires "${modules[@]}") \

-             <(all_provides "${modules[@]}") \

-         | awk '

+     kernel=$(/sbin/modinfo -F vermagic "${modules[0]}" | sed -e 's: .*::' -e q)

+ 

+     # get all that kernel provides

+     symvers=$(mktemp -t ${0##*/}.XXXXX)

+ 

+     cat /usr/src/kernels/$kernel/Module.symvers | awk '

          BEGIN { FS = "\t" ; OFS = "\t" }

-         { print $3 "/" $2 "/" $1 }

-         ' \

-         | sort -u) \

-     | sort -u \

-     | awk '

-     { FS = "\t" ; OFS = "\t" }

-     NF == 3 { print "kernel(" $2 ") = " $3

-               next }

-             { split($1, arr, "/")

-               print "ksym(" arr[3] ") = " arr[2] }

-     '

+         { print $2 "\t" $1 }

+     ' \

+     | sed -r -e 's:$:\t'"$kernel"':' \

+     | LC_ALL=C sort -k1,1 -u > $symvers

+ 

+     # Symbols matching with the kernel get a "kernel" dependency

+     LC_ALL=C join -t $'\t' -j 1 $symvers <(mod_requires "${modules[@]}") | LC_ALL=C sort -u \

+     | awk '{ FS = "\t" ; OFS = "\t" } { print "kernel(" $1 ") = " $2 }'

+ 

+     # Symbols from elsewhere get a "ksym" dependency

+     LC_ALL=C join -t $'\t' -j 1 -v 2 $symvers <(mod_requires "${modules[@]}") | LC_ALL=C sort -u \

+     | awk '{ FS = "\t" ; OFS = "\t" } { print "ksym(" $1 ") = " $2 }'

  fi

find-provides.ksyms and find-requires.ksyms contain macros for
generate external kernel module symbol dependency table.
These scripts are broken in fedora for long time.
Patch fix both and make it useable again.

-Petr

Signed-off-by: Petr Oros poros@redhat.com

why not if [ -n "$(…)" ] ?

I am used to for [[. It is similar but [[ is more powerful and work everywhere. In this case could be both.

The problem here is that we're supposed to review something we have no insight on. And it all makes little sense in Fedora anyway, AFAICS this stuff is only really there for the benefit of RHEL, so maintaining it through Fedora is cumbersome to say the least.

What I'd really like to see is the kernel-rpm-macros side split into it's own source-level package, whose maintainers can then do whatever they see fit to it. I've expressed this wish several times over the years but so far nobody has volunteered...

Well I can split off kernel-rpm-macros into its own package (and will happily do so) but I'd probably not be the best maintainer of it. I honestly don't know why it exists at all anyway. Does anything in Fedora even use it?

The macro file also has these two lines:

redhat_kernel_module_package    1
kernel_module_package_release   1

which... I don't know. What does that even do?. And its redefinition of %__find_provides and %__find_requires seems... sketchy.

@tibbs - exactly my point. I keep saying that it needs to be split off (I already split it into a sub-package to support this long ago), and the way I see it, it only makes sense to maintain it in RHEL. But this needs action from the kernel side folks who care about this stuff!

Commit 4d324ad fixes this pull-request

Pull-Request has been merged by pmatilai

6 years ago

Pull-Request has been merged by pmatilai

6 years ago