System.map
Linuxにおいて、System.mapファイルとはカーネルが使用するシンボルテーブルである。
シンボルテーブルはメモリ上でシンボル名とアドレスの対応関係を示す。シンボル名は、値もしくは関数名である場合が多い。System.mapファイルは、シンボル名のアドレスまたはアドレスの示すシンボル名が必要とされるケースにおいて要求される。とりわけこれはカーネルパニックやLinux kernel oopsが発生した場合、そのデバッグの役に立つ。カーネルは、コンフィグレーション(Kconfig)にてCONFIG_KALLSYMS
を有効化すると自身のアドレス-名前変換を行う。この処理にはksymoopsのようなツールは最早必要としない[1]。
次の項目はSystem.map
ファイルの一部である。:
c041bc90 b packet_sklist
c041bc94 b packet_sklist_lock
c041bc94 b packet_socks_nr
c041bc98 A __bss_stop
c041bc98 A _end
c041c000 A pg0
ffffe400 A __kernel_vsyscall
ffffe410 A SYSENTER_RETURN
ffffe420 A __kernel_sigreturn
ffffe440 A __kernel_rt_sigreturn
nmコマンドの出力結果そのものであることが理解できる。
スペースで区切られた、アドレスとシンボルの間の文字列は、そのシンボルの「型」を示している。UNIXシステムにおけるnmユーティリティプログラムはオブジェクトファイルからシンボルをリストアップする。System.mapファイルは直接これと関係しており、すなわち、カーネル(をあたかも、プログラムとみなして)全体にnmコマンドを掛け、その出力結果をこのファイルに書き出したものであることが分かる。それは、カーネルよりももっと小さいオブジェクトファイルに対し、nmがシンボルとその型をリストアップすることと同様である。
カーネルビルドのプロセスを含めて説明すると、通常、Linuxカーネルビルドの最終段階に到達すると、実行ファイル"vmlinux"が生成される。このファイルに対し、nmコマンドを実行し、その出力結果をSystem.mapファイルとして生成する。ちなみにSystem.map生成後は、vmlinuxからシンボルがストリップされ、特殊なコードをリンク、圧縮し、"zImage"もしくは"bzImage"というファイルが生成される。これが通常目にするカーネル本体である。アドレスはコンパイル時に決定されるため、カーネルビルドの度にSystem.map
ファイルが生成される。
型のいくつかを説明する(用語はELFに倣っている):
A 絶対アドレス
B または b 未初期化データセクション(BSSと呼称される)
D または d 初期化済データセクション
G または g 小さいオブジェクト用の初期化済データセクション (global)
i DLL特有のセクション
N デバッギングシンボル
p スタック削除(stack unwind)セクション
R または r 読み取り専用データセクション
S または s 小さいオブジェクト用の未初期化データセクション
T または t テキスト(コード)セクション
U 未定義
V または v 弱いオブジェクト
W または w タグ付けされていないままの弱いオブジェクト
- a.outオブジェクトファイルにおけるスタブシンボル
? 'シンボル型不明'
ファイルシステムにおけるSystem.mapファイルの配置
[編集]カーネルのビルドが正常終了すると、System.map
はカーネルソースコードのトップディレクトリに作られるが、いくつかの上位のソフトウェアインストレーションステップにより、その他のディレクトリにコピーされ得る:
/boot/System.map-$(uname -r)
- SVGALibのビルドにおいては
/lib/modules/$(uname -r)/build/System.map
に存在することを仮定している。
また/proc/kallsyms
はLinuxカーネルバージョン2.5.71以上のシステムにおいて、読み込まれているシンボル名とアドレスを表示する[2]。それはSystem.mapファイルの一部に相当する。
脚注
[編集]- ^ [1] NOTE: ksymoops is useless on 2.6.
- ^ JM Project (2009年9月30日). “Man page of PROC”. linuxjm.sourceforge.jp. 2011年1月27日閲覧。