web-dev-qa-db-ja.com

カーネルモジュールの読み込み中に不明なシンボル

モジュールを挿入したときにエラーが発生する理由を理解するのに助けが必要です。私は this を試しましたが、成功しませんでした。

$ Sudo modprobe lpfc_scst 
FATAL: Error inserting lpfc_scst (/lib/modules/2.6.32-33-generic/extra/lpfc_scst.ko): Unknown symbol in module, or unknown parameter (see dmesg)

$ dmesg | tail
[ 1201.262842] lpfc_scst: Unknown symbol scst_register_target
[ 1201.262949] lpfc_scst: Unknown symbol lpfc_tm_term
[ 1201.263161] lpfc_scst: no symbol version for scst_register_session
[ 1201.263164] lpfc_scst: Unknown symbol scst_register_session
[ 1201.263284] lpfc_scst: no symbol version for scst_rx_mgmt_fn
[ 1201.263286] lpfc_scst: Unknown symbol scst_rx_mgmt_fn
[ 1201.263395] lpfc_scst: no symbol version for scst_unregister_session
[ 1201.263398] lpfc_scst: Unknown symbol scst_unregister_session
[ 1201.263573] lpfc_scst: no symbol version for scst_rx_data
[ 1201.263575] lpfc_scst: Unknown symbol scst_rx_data

$ cat /proc/kallsyms | grep scst_register_target
dffd2a10 r __ksymtab_scst_register_target   [scst]
dffd302e r __kstrtab_scst_register_target   [scst]
dffd2b34 r __kcrctab_scst_register_target   [scst]
dffd2a20 r __ksymtab___scst_register_target_template_non_gpl    [scst]
dffd3063 r __kstrtab___scst_register_target_template_non_gpl    [scst]
dffd2b3c r __kcrctab___scst_register_target_template_non_gpl    [scst]
dffd2c10 r __ksymtab___scst_register_target_template    [scst]
dffd308b r __kstrtab___scst_register_target_template    [scst]
dffd2de8 r __kcrctab___scst_register_target_template    [scst]
dff913a0 t __scst_register_target_template  [scst]
dff90dd0 T scst_register_target [scst]
dff91840 T __scst_register_target_template_non_gpl  [scst]

$

どうもありがとう。

14
user663896

このフォーラム で提案されているように、私はこの問題を解決しました:

  1. scstをコンパイルしました。
  2. 生成されたModule.symversを既存の/lib/modules/<version>/build/Module.symversに追加しました(Hack。カーネルがエクスポートされたシンボルを表示しなかった理由がわかりません)。
  3. scst/lib/modules/<version>/extraにコピーしました。
  4. depmod -a
  5. lpfc_scstをコンパイルしました。
  6. 問題なく挿入されたモジュールlpfc_scst

ごきげんよう。

10
user663896

これは、カーネルがモジュールにその変数を見ることを許可していないことを意味します。カーネルがエクスポートするシンボルのリストに変数を追加していないようです:

EXPORT_SYMBOL_NOVERS(scst_register_target);
2

実行中のカーネルの実際のソースではないカーネルソースツリー/ヘッダーに対してビルドされたモジュールをinsmodしようとしている場合、最も可能性の高い原因は、実行中のカーネルとビルドしたカーネルの間で一部のカーネル構成が異なることです。モジュールに対して。

Linuxカーネル内のリンカは、実際には、シンボル名に加えて、関数名と戻り値のハッシュ、シンボル名の照合を試みる際のさまざまな構成オプション(プリエンプト/非プリエンプト)など、一致するシンボルのシンボル名を調べます。私はあなたの場合、異なる設定オプションのために正しい一致を見つけられないと思います

1
gby