System.map

Linuxにおいて、System.mapファイルとはカーネルが使用するシンボルテーブルである。

シンボルテーブルはメモリ上でシンボル名とアドレスの対応関係を示す。シンボル名は、値もしくは関数名である場合が多い。System.mapファイルは、シンボル名のアドレスまたはアドレスの示すシンボル名が必要とされるケースにおいて要求される。とりわけこれはカーネルパニックやLinux kernel oopsが発生した場合、そのデバッグの役に立つ。カーネルは、コンフィグレーション(Kconfig)にてCONFIG_KALLSYMSを有効化すると自身のアドレス-名前変換を行う。この処理にはksymoopsのようなツールは最早必要としない。

次の項目は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以上のシステムにおいて、読み込まれているシンボル名とアドレスを表示する。それはSystem.mapファイルの一部に相当する。

脚注

関連項目
 Linux kernel oops
 カーネルパニック
 vmunix
 vmlinux

Linux
ファイルフォーマット