2012-03-30 22 views
5

ロード可能なカーネルモジュールから明示的にエクスポートされないnet/ipv4/af_inet.cのカーネルグローバル変数にアクセスする必要があります。現在、2.6.18カーネルを使用しています。EXPORT_SYMBOLでエクスポートされないLinuxカーネルシンボルにアクセスする*

kallsyms_lookup_nameは(エクスポートされません)もう利用可能であるようには見えない

NULL(さらに読め、symbol_get/__ symbol_getのみエクスポートされたシンボルが含まれているカーネルと既存のモジュールのシンボルテーブルを通じて見て、それを返します__symbol_get

カーネルモジュールからエクスポートされていないシンボルにアクセスする方法はありますか?いいえ、実際には、シンボルがエクスポートされたモジュールがロードされていることを確認してください。

多くの人が読んで答えを見ると、kAPIが時間の経過とともに大きく変化するため、多くのカーネルバージョンで1つの方法を見つけるのは非常に難しいようです。

+0

'objdump path/to/modulename.ko'は必要な作業を行いますか?出力をデコードして、モジュール内の対応するオフセットを決定し、それを適用する必要があります。輸出されていないシンボルを取得する目的は何ですか? – wallyk

+0

はい、ユーザー空間の/ proc/kallsyms経由でアドレスを取得して、モジュールに渡すこともできますが、これはちょっとハッキリしているようですので、何か良いかどうか疑問に思っていました。ネットワーキングコードの一部を取り出してモジュールにするため、カーネルを再起動することなくバグ修正を行うことができます。 –

答えて

4

上記の方法を/ proc/kallsymsから取得するか、System.mapで指定されたアドレス(同じことです)を使用するだけで、これはハッキリしているように見えますが、それは以前に行われたことを見た(本当に自分でそれを行う必要はなかった)。どちらか、あるいはあなたが実際にEXPORT_SYMBOLをエクスポートする場所に独自のカスタムカーネルを構築できますが、これは移植性がありません。

+0

イエス、どこで/ proc/kallsymsメソッドを見たことがありますか?それは本番環境ですか?標準のカーネルを再コンパイルせずに作業したいという方が正しいです。 –

+0

@softwareengineer通常、私たちが再コンパイルせずにカーネルに追加したい機能をテストしているか、単にリムーバブルなモジュラー機能として持っているだけの機能をテストしています。私はそれを1〜2回見たことがあります。その前に、私はSystem.mapを見て、アドレスをモジュールにハードコードしました。 –

+0

ありがとう私は数日待って誰かが何かを考え出すことができるかどうかを見ますが、もしそうでなければ、私はあなたを受け入れることができます。 –

5

パフォーマンスが大きな問題ではない場合、kallsyms_on_each_symbol()(GPLモジュールの場合はカーネルによってエクスポートされます)でシンボルのリスト全体を走査し、必要なものを得るために名前を確認できます。私は他の選択肢がない限りそうすることをお勧めしません。

このようにしたい場合は、こちらのプロジェクトのan exampleです。 kallsyms_on_each_symbol()の使用法とsymbol_walk_callback()のコードを参照してください。他の部分はこの質問とは関係ありません。

+0

しかし、この関数はより最近のカーネルでしか利用できないようです。 2.6.18または2.6.25ではなく、2.6.30にあります。私は元の質問に2.6.18カーネルを指定していたはずです。 –

関連する問題