本文へ移動

System.map(Linuxカーネルのシンボルテーブル)

System.mapは、リンク時のアドレスとシンボル名を記録するLinuxカーネルのシンボルテーブル・ファイルである。oopsログの解釈、アドレス変換、モジュールおよびクラッシュ解析に役立つ。

概要

System.mapは、Linuxカーネルのビルド時に生成されるプレーンテキスト形式のシンボルテーブルである。関数、変数、その他のカーネルシンボルの名前を、リンク時のアドレスおよび型コードと対応付けて記録する。各シンボルがカーネルイメージ内のどこに配置されたかを示すため、カーネルのoops、panic時のスタックトレース、その他の低水準診断を解釈するための重要な補助情報となる。カーネルのビルドとシンボルの背景については、Linuxカーネルの文書を参照。

形式と一般的なシンボル型

System.mapの空でない各行は、通常、16進数のアドレス、1文字の型コード、シンボル名という3つのフィールドから成る。型コードはシンボルの分類を示し、代表的な文字には次のものがある。

  • Tまたはt — テキスト(テキストセグメント)内のコード
  • Dまたはd — 初期化済みデータ
  • Bまたはb — 未初期化データ(BSS)
  • Rまたはr — 読み取り専用データ
  • U — 未定義(外部参照)
  • W — 弱いシンボル

用途と実用例

System.mapは主に、カーネルログに現れる生のアドレスを、人が読めるシンボル名とおおよその位置に変換するために使われる。カーネルのoopsが一連のアドレスを出力した場合、それらを適切なSystem.mapと照合することで、関与した関数や変数を明らかにできる。開発者は、シンボル参照が実行中のカーネルビルドと整合していることを確認するため、カーネルモジュールのビルドやデバッグ時にもSystem.mapを参照する。より深いソースコードレベルの対応付けには、ストリップされていないvmlinuxファイルおよびaddr2lineなどのツールとともに使用される。

実行時シンボルとの関係とセキュリティ上の注意

System.mapが示すのは、ビルドされたカーネルイメージにおけるリンク時のアドレスである。Kernel Address Space Layout Randomization(KASLR)などの現代的なカーネル機能は実行時アドレスを移動させる場合があるため、再配置を考慮しない限り、System.mapのアドレスは稼働中のカーネルのアドレスと一致しないことがある。実行中のシステムでシンボルを解決する用途では、カーネルはアクセス制限の対象となる/proc/kallsymsを公開しており、そこには実行時アドレスが反映される。本番用カーネルのSystem.mapを公開または露出させるとカーネルのレイアウト情報が明らかになる可能性があり、情報漏えいのおそれとして扱われることがある。

配置場所、生成方法、制限事項

ディストリビューションでは通常、対応するSystem.mapファイルを/boot以下にインストールし、たとえばカーネルのバージョンを含む名前を付ける。このファイルはビルド時に、vmlinuxのシンボルテーブルから生成される。生成にはnmなどのビルドツールや、カーネルビルドシステム内のスクリプトが用いられる。カーネルがストリップ済みである場合、またはSystem.mapが実行中カーネルのバージョンや設定と一致しない場合、シンボル検索の結果は不正確になる。信頼できるデバッグのためには、システムで使用されたカーネルイメージおよびビルドに正確に対応するSystem.mapを使用する必要がある。

関連資料

カーネルアドレスの変換やバックトレースの解析に関する実践的な案内は、カーネルデバッグについての資料、およびvmlinux、System.map、クラッシュダンプを扱うツールを参照。

関連項目

著者

AlegsaOnline.com System.map(Linuxカーネルのシンボルテーブル)

URL: https://ja.alegsaonline.com/art/95718

共有

出典