System.map

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