__ksymtabとは何ですか? Linuxカーネル

2013-08-28 linux kernel symbols

「proc / kallsyms」または「system.map」をcatすると、このようなシンボルが得られます

....
c033718c T nf_hook_slow
c04ca284 r __ksymtab_nf_hook_slow
c04ca28c r __ksymtab_nf_hooks
c04d24a0 r __kcrctab_nf_hook_slow
c04d24a4 r __kcrctab_nf_hooks
c04e9122 r __kstrtab_nf_hook_slow
c04e9179 r __kstrtab_nf_hooks
c054d854 D nf_hooks
c0571ca0 d nf_hook_mutex
....
  1. T、r、D、dの意味は何ですか?
  2. カーネルソースでEXPORT_SYMBOL(...)としてシンボルを見つけることができます。 しかし、__ ksymtab ...または__kstrtab ...で始まる他のものがあります。 これは何?
  3. System.mapにはシンボルがありますが、/ proc / kallsymsには除外されている可能性はありますか? (カーネルが適切にコンパイルされていると仮定)
  4. Linuxカーネルを有効にしたnetfilterがありますが、シンボル 'nf_hooks'が見つかりません しかし、「__ ksymtab_nf_hook」があります。 nf_hooksのアドレスを取得する方法はありますか __ksymtab_nf_hookを使用していますか?
  5. LinuxのソースコードにEXPORT_SYMBOL(nf_hook)がありますが、見つけられません 「cat / proc / kallsyms」。これにはいくつかの典型的な理由がありますか?

前もって感謝します。

Answers

  1. 形式はnmユーティリティ出力の形式に似ていますこのページも参照してください

    簡単に言うと、「T」は通常グローバル(非静的だが必ずしもエクスポートされない)関数、「t」-コンパイルユニットにローカルな関数(静的)、「D」-グローバルデータ、「d」-コンパイル単位にローカルなデータ。 「R」および「r」-「D」/「d」と同じですが、読み取り専用データ用です。

  2. これらは、シンボルをカーネルモジュールで使用できるように、シンボルをエクスポートするために必要な特別なセクションのアイテムです。

    エクスポートされた各シンボルについて、少なくとも次のものがEXPORT_SYMBOL()によって定義されEXPORT_SYMBOL()

    • __kstrtab_<symbol_name> -文字列としてのシンボルの名前
    • __ksymtab_<symbol_name> -シンボルに関する情報を持つ構造体:そのアドレス、 __kstrtab_<symbol_name>アドレスなど。
    • __kcrctab_<symbol_name> -シンボルのコントロールサム(CRC)のアドレス-たとえば、カーネルまたはモジュールが特定のカーネルモジュールで必要なものとまったく同じシンボルを提供するかどうかを確認するために使用されます。モジュールに特定の名前とCRCのシンボルが必要で、カーネルがその名前と異なるCRCのシンボルを提供する場合(たとえば、モジュールが異なるカーネルバージョン用にコンパイルされた場合)、モジュールローダーはそのカーネルモジュールのロードを拒否します(このチェックが無効になっていない限り)。

    詳細については、 linux / export.hEXPORT_SYMBOL()マクロの実装をEXPORT_SYMBOL()ください。

  3. 確かではありませんが、これまでのところ、関数(「テキストシンボル」)または変数(「データシンボル」)がSystem.mapに存在したが、カーネルが適切にコンパイルされている場合は/ proc / kallsymsに表示されていません。 kallsymsが完全に有効になっている(CONFIG_KALLSYMS = y、CONFIG_KALLSYMS_ALL = y)。 CONFIG_KALLSYMS_ALL = nの場合、関数(正確には* .textセクションのシンボル)のみが/ proc / kallsymsに表示されます。

  4. カーネルのバージョンに依存します。カーネルのEXPORT_SYMBOL()定義を見て、 __ksymtab_<symbol_name>変数のタイプを見つけることができます。カーネル3.11では、 linux / export.hで定義されたstruct kernel_symbol です 。その構造体とそのアドレスの定義があれば、シンボルのアドレスを取得できると思います: struct kernel_symbol::value 。しかし、自分でこれを試したことはありません。

    注意は、しかし、その__ksymtab_nf_hookですnf_hookではなく、ためにnf_hooks 。名前は一致する必要があります。 nf_hooksnf_hookは異なるエンティティです。

  5. コードと/ proc / kallsymsの関連部分を見ずに伝えるのは難しい。たぶん#ifdefされてコンパイルされず、何か他のものがあるかもしれません。

    また、 nf_hooksはデータ項目なので、CONFIG_KALLSYMS_ALLが「n」の場合、/ proc / kallsymsに表示されない場合があります。

Related