web-dev-qa-db-ja.com

Linuxはカーネルモジュールに不明なシンボルがあると言っていますが、別のロードされたモジュールがそれを提供します

SB DAQボックス用のドライバー をインストールしようとしていますが、これは厄介なことに、自分でコンパイルする必要があります。私は成功したと思います-2つの.koファイルがあります:

-rw-r--r--  1 root  root  45271 2010-03-18 21:24 advdrv_core.ko
-rw-r--r--  1 root  root  24312 2010-03-18 21:24 usb4761.ko

最初はインシデントなしでinsmodを実行できましたが、2番目を試すと、大量のメッセージが表示されます。

kernel: [686782.106547] usb4761: no symbol version for adv_process_info_check_event
kernel: [686782.106555] usb4761: Unknown symbol adv_process_info_check_event
kernel: [686782.106691] usb4761: no symbol version for advdrv_unregister_driver
kernel: [686782.106695] usb4761: Unknown symbol advdrv_unregister_driver

ただし、advdrv_core.koはこれらのシンボルを提供します。私のカーネルはそれらをメモリに持っているようです:

# cat /proc/kallsyms | grep advdrv_unregister_driver
f8d88504 r __ksymtab_advdrv_unregister_driver   [advdrv_core]
f8d888d2 r __kstrtab_advdrv_unregister_driver   [advdrv_core]
f8d885a4 r __kcrctab_advdrv_unregister_driver   [advdrv_core]
086eb8fb a __crc_advdrv_unregister_driver       [advdrv_core]
f8d86e90 t advdrv_unregister_driver     [advdrv_core]

なぜ私のinsmodはそれらが未知のシンボルであると主張するのですか?

編集:以下の回答の1つは、ファイルを/ lib/modulesにコピーしてdepmodを実行することを勧めています。そこで、私はdepmodの-v(冗長)オプションを使用して実行しました。出力の中には次のような行がたくさんありました:

/lib/modules/2.6.27-7-generic/kernel/drivers/pcmcia/usb4761.ko needs "advdrv_unregister_driver": /lib/modules/2.6.27-7-generic/kernel/drivers/pcmcia/advdrv_core.ko

次に、rmmod advdrv_coreを実行して新規にインストールしたことを確認し、modprobe advdrv_coreを実行し、最後にmodprobe usb4761を実行しました。

繰り返しますが、advdrv_unregister_driverを含む、失敗したシンボルの束。

5
raldi

Advantechドライバーのコンパイルで同様の問題が発生しました。ここでの操作フレーズは、実際には「シンボルなしバージョン」です。

http://lxr.linux.no/#linux+v2.6.33/Documentation/kbuild/modules.txt のセクション7に、モジュールのバージョン管理の詳細が記載されています。セクション7.3は特に重要です。私にとって最も簡単な解決策は、KBUILD_EXTRA_SYMBOLS行を続けることでした(上記のmodules.txtの526行目から説明しています)。あなたの場合、おそらく次のような行を追加することができます

KBUILD_EXTRA_SYMBOLS:= [driver_root] /kernel/core/Module.symvers

[driver_root]/kernel/USB-4761/Makefileの先頭に。

4
jjlin

.koをカーネルのモジュールディレクトリにコピーし、depmodを実行します。

0
Geraint Jones