web-dev-qa-db-ja.com

module_layoutバージョンの非互換性

私が移植したLinuxカーネルレガシーモジュールをinsmodしようとしています。次のエラーが表示されます。

> Sudo insmod camac-mx.ko
insmod: error inserting 'camac-mx.ko': -1 Invalid module format
dmesg |tail -n 1
[1312783.938299] camac_mx: disagrees about version of symbol module_layout

どうすれば修正できますか?

27
Basilevs

これは、実行中のカーネルとは異なるバージョンのカーネルに対してモジュールをコンパイルしたことを示しています。実行中のカーネルとカーネルソースの数値が同じ場合(たとえば、両方とも2.6.31-20-server)でも、2つが異なる構成オプションを使用している場合、このエラーが表示されることがあります。また、マシンにこのモジュールの複数のバージョンがあるかどうかを確認し、正しいバージョンをロードしていることを確認してください。

29
ctuffli

カーネル、kernel-config、またはksymsにアクセスできないシステムで作業している場合、working.koおよび構築された、機能しない、broken.ko

おそらくロードされない可能性がありますが、試してみるのに十分なほど必死であれば。

# modprobe --dump-modversions working.ko
0x0b11e775      module_layout
# modprobe --dump-modversions broken.ko
0x2719d41e      module_layout

次に、お気に入りの16進エディターを使用して、一致するように変更します。

00016c70  75 e7 11 0b 6d 6f 64 75  6c 65 5f 6c 61 79 6f 75  |u...module_layou|

(エンディアンの順序により値は逆になります)ほとんどの場合、一致しなければならない束があります。誰かがこれを行うPerlスクリプトを書くことができます。

13
lundman

それを解決するのは大変でした。

まず、カーネルソースとヘッダーが必要です。

カーネルベースディレクトリに移動します。ここでは/ usr/src/linux-source-2.6.35

name -r、ここでは2.6.35-27-genericを確認してください

make -C /lib/modules/2.6.35-27-generic/build \
SUBDIRS=/usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k modules

/lib/modules/2.6.35-27-generic/build-> /usr/src/linux-headers-2.6.35-27-generic

modinfoまたはlsmodを使用してモジュールの依存関係を確認し、スクリプトにロードします。

modprobe -r ath5k
modprobe cfg80211
modprobe led_class
modprobe mac80211
modprobe ath
insmod /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko

この方法では、vermagicも異なる可能性があります。..make modules_installは役に立たなかったのですが、モジュールが2つの異なる場所(/ lib/modules/extraおよび.../kernel/drivers)に存在し、置き換えられていない可能性があります。 。

modinfo -F vermagic /usr/src/linux-source-2.6.35/drivers/net/wireless/ath/ath5k/ath5k.ko

モジュールを修正/デバッグするのがubuntu 10.10でとても難しい理由は本当にわかりません:(

7
Tanguy

高速で実用的なソリューションが見つかりました こちら

modules/buildではなく、makefile/usr/src/linux-sourceディレクトリを使用してください。

    make -C /lib/modules/`uname -r`/build ...
2
SergeyR

Android 1つのバイナリモジュール(グラフィックスの場合はpvrsrvkm)システム。このシステムのソースからカーネルを構築しています。一般的にはすべて正常に動作しますが、いくつかのカーネル.configオプション(kgdb )、pvrsrvkmモジュールは「シンボルのバージョンに同意しない」エラーでロードされませんでした。

PvrsrvkmモジュールはAndroidによって早期にロードされ、それが失敗すると、システムはGUIなしで使用できなくなります。

すでにカーネルを構築していたので、私の簡単な修正は、カーネルソースファイルkernel/module.cに1行(versindex = 0;)を追加することでバージョンチェックを無効にすることでした。

static int check_version(Elf_Shdr *sechdrs,
unsigned int versindex,
const char *symname,
struct module *mod,
const unsigned long *crc,
const struct module *crc_owner) 
{
unsigned int i, num_versions;
struct modversion_info *versions;

/* Exporting module didn't supply crcs?  OK, we're already tainted. */
if (!crc)
    return 1;

/* No versions at all?  modprobe --force does this. */
versindex = 0; // I added this line
if (versindex == 0)
    return try_to_force_load(mod, symname) == 0;
0
mkc4s

ソースカーネルの前

きれいにするArch = arm CROSS_COMPILE = arm-linux-gnueabi-

ソースカーネルのファイルを編集します。Module.symversが「Module_layout」を有効なものに変更します。このファイルをデバイスで検索できます

ドライバーの例の再コンパイル:make -C〜/ source-kernel Arch = arm CROSS_COMPILE = arm-linux-gnueabihf- DIR =/source-kernel M =/modules/example modules

Sudo modprobe --dump-modversions XXX.koでXXX.koのmodule_layoutを確認します。

NB

0
Naw