vermagicとmodversionsを偽装する方法(Dirty Hack、備忘録)
LinuxではKernelをコンパイルした際、異なるversionのmoduleをインストールして不具合が起きないようにチェック機構を設けている。
これは通常、正しいversionのlinux-headerを指定することで解決するのが筋である。しかし、Raspberry Piで同じことをやろうとしたがなかなかうまく行かなかった。
次善の策としてはmodprobe -fでチェックを無視できるはずなのだがこれも上手く動かない(無視されてるらしい?)
そこで無理やりどうにかすることを考えた。
kernel/module.c
moduleに関する処理はkernel/module.c中にある。これを読んだ。
チェックはsetup_load_info中のcheck_modstruct_versionで行われる
これはkernel optionでCONFIG_MODVERSIONSが有効であった場合、常に1を返す(チェックが無い)。 CONFIG_MODVERSIONSが無効であった場合、該当するkernel module中から.modinfoと__versionsというsectionを探し正しい値かどうかを確かめる。
そこで.modinfoと__versionsを正しいmoduleから引っ張ってきて差し替える。
具体的にはobjcopy --only-sectionで正しいmoduleから抜き出し、objcopy --remove-section --add-sectionで差し替え、objcopy --set-section-flagsでsectionのflagを調整する。
どう考えてももっと良い手法があるはずだけどRaspberry Piは色々めんどい。