私が移植した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
どうすれば修正できますか?
これは、実行中のカーネルとは異なるバージョンのカーネルに対してモジュールをコンパイルしたことを示しています。実行中のカーネルとカーネルソースの数値が同じ場合(たとえば、両方とも2.6.31-20-server)でも、2つが異なる構成オプションを使用している場合、このエラーが表示されることがあります。また、マシンにこのモジュールの複数のバージョンがあるかどうかを確認し、正しいバージョンをロードしていることを確認してください。
カーネル、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スクリプトを書くことができます。
それを解決するのは大変でした。
まず、カーネルソースとヘッダーが必要です。
カーネルベースディレクトリに移動します。ここでは/ 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でとても難しい理由は本当にわかりません:(
高速で実用的なソリューションが見つかりました こちら 。
modules/build
ではなく、makefile
の/usr/src/linux-source
ディレクトリを使用してください。
make -C /lib/modules/`uname -r`/build ...
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;
ソースカーネルの前
きれいにする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