KALLSYMS(8) Linux Module Support KALLSYMS(8)
名前
kallsyms - デバッグ用に全てのカーネルシンボルを抽出する
書式
kallsyms [-Vh] kernel_filename
説明
kallsyms はカーネルからスタック以外のシンボルをすべて抽出し、オブジェク
トデータをビルドする。このデータはそのカーネルからリンクすることがで き
、デバッガから利用できる。
通 常のカーネルはモジュールから利用されるシンボルしかエクスポートしない
。デバッグするときには、このエクスポートされたリストだけでなく、スタ ッ
ク シ ンボル以外の全てのリストがほしい場合があるかもしれない。 kallsyms
はカーネルから全てのセクションとシンボルを抽出し、セクション・シンボ ル
及 びそれらのアドレスのリストを構築し、 __kallsyms セクションのみからな
るリロケータブルなオブジェクトを書きだす。 __kallsyms セクションをカ ー
ネ ルにリンクし、そのカーネルをブートすると、デバッガは __kallsyms セク
ションのデータを利用してより多くのシンボルを解決できるようになる。
例えば、デバッガは __kallsyms データを用いて、以下のようなもののカー ネ
ルアドレスを求めることができる:
* __kallsyms セクションが所属するカーネルまたはモジュール
* __kallsyms セクションの所属するコード内部のセクション
* 一番近いシンボル
オプション
-h, --help
オプションの一覧を表示して終了する。
-V, --version
kallsyms のバージョンを表示する。
リンク作業
正しく __kallsyms セクションを含んだカーネルを作成するには、 4 段階のリ
ンク作業を行わなければならない (通常は 1 段階のみ)。 kallsyms とリン カ
は高速だから、P200 なら余分の 3 段階には数秒しかかからない。
1 __kallsyms データがない状態での、カーネルの最初のビルド。 kallsyms
をこのリンクの出力に対して実行し、生カーネルの全てのセクションと全て
のシンボルを含む、リロケータブルなオブジェクトを作成する。
2 再びカーネルをリンクする。今回は (1) での kallsyms の出力も含める。
__kallsyms セクションを追加すると、セクション数や多くのカーネルシ ン
ボルのオフセットが変更されるので、もう一度 kallsyms をこの二番目のリ
ンクに実行し、再びリロケータブルな出力をセーブする。
3 再びカーネルをリンクする。今回は (2) での kallsyms の出力を含める 。
kallsyms を一番新しいカーネルに対して実行する。この段階で __kallsyms
セクションのサイズと位置は安定し、これ以降はカーネルの各セクション・
シンボルは変わらない。 kallsyms の出力にはカーネルシンボルの最終値が
含まれる。
4 (3) での kallsyms の出力を含め、最終的なカーネルをリンクする。
データフォーマット
__kallsyms セクションは通常と少々異なる。これはリロケータブルなデータを
故 意に持たず、全ての「ポインタ」はセクションへのバイトオフセットか、あ
るいは絶対値として表される。すなわちこのセクションはどこにでも置くこ と
が でき、リロケーションの問題を気にしなくてよい。これはカーネルイメージ
の内部に置くことができ、カーネルイメージの外部にも置くことができ、ロ ー
ド 直前のモジュールに追加することもでき、別の領域に置くこともできる、な
どなど。
/usr/include/sys/kallsyms.h には __kallsyms データのマッピングが記述 さ
れている。
ヘッダ
* ヘッダのサイズ。
* __kallsyms データ全体のサイズ。文字列も含む。
* セクション数。メモリにロードされたセクションのみ。
* __kallsyms ヘッダのスタートから、最初のセクションエントリまでのオフ
セット。
* 各セクションエントリのサイズ。名前文字列は除く。
* シンボルの数。
* __kallsyms ヘッダのスタートから先頭のシンボルエントリまでのオフセ ッ
ト。
* 各シンボルエントリのサイズ。名前文字列は除く。
* __kallsyms ヘッダのスタートから先頭の文字列までのオフセット。
* 最初のセクションの開始アドレス(注[1])。
* 最後のセクションの終了アドレス(注[1])。
セクションエントリ
ロードされたセクションごとにひとつ。 _kallsyms はロードされるセクション
なので、入力ファイルに __kallsyms セクションが含まれていれば、このリ ス
トに含まれる。
* カーネル内部でのそのセクションのスタート(注[1])。
* セクションのサイズ。
* セクションの名前への、 __kallsyms 文字列のスタートからのオフセット。
* オリジナルの Elf セクションからのセクションフラグ。
シンボルエントリ
入力ファイルでのシンボルごとにひとつ。ロードされたセクションにあった シ
ンボルだけが保存される。
* このシンボルが属する __kallsyms のセクションエントリに対するオフセッ
ト。オフセットは __kallsyms のセクションエントリのスタートからとる。
* カーネル内部のシンボルのアドレス(注[1])。シンボルはこのフィールドの
昇順で保存される。
* シンボル名への、 __kallsyms 文字列のスタートからのオフセット。
文字列
NUL 終端文字列のセット。各名前は __kallsyms の文字列領域のスタートか ら
のオフセットで参照される。
注[1]
こ れらのフィールドは「全てはオフセット」ルールからは除外されている。こ
れらはカーネル内部での絶対アドレスである。
関連項目
insmod(8)
履歴
最初のバージョンは 2000 年に Keith Owens
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa