シンボルテーブルとは?


88

誰かがCおよびC ++のコンテキスト内にあるシンボルテーブルを説明できますか?

回答:


82

ここでは、シンボルテーブルの2つの一般的な関連する意味があります。

まず、オブジェクトファイルにシンボルテーブルがあります。通常、CまたはC ++コンパイラは、単一のソースファイルを、拡張子が.objまたは.oのオブジェクトファイルにコンパイルします。これには、リンカが作業アプリケーションまたは共有ライブラリに処理できる実行可能コードとデータのコレクションが含まれています。オブジェクトファイルには、シンボルテーブルと呼ばれるデータ構造があり、オブジェクトファイル内のさまざまなアイテムを、リンカーが理解できる名前にマッピングします。コードから関数を呼び出す場合、コンパイラはルーチンの最終アドレスをオブジェクトファイルに入れません。代わりに、プレースホルダー値をコードに入れ、処理中のすべてのオブジェクトファイルからさまざまなシンボルテーブル内の参照を検索して最終的な場所をそこに固定するようリンカーに指示するメモを追加します。

次に、共有ライブラリまたはDLLにシンボルテーブルがあります。これはリンカによって生成され、ライブラリのユーザーに表示されるすべての関数とデータ項目に名前を付けるのに役立ちます。これにより、システムはランタイムリンクを実行し、ライブラリがメモリに読み込まれる場所へのそれらの名前への開いた参照を解決できます。

詳細を知りたい場合は、John Levineの優れた本「Linkers and Loaders」をお勧めします。リンクテキスト


こんにちは、Ben、2番目のケースでは、エクスポートテーブルを参照していますか?つまり、エクスポートテーブルはシンボルテーブルの特別なケースですか?それともこれらの無関係な概念ですか?
Pooven 2014年

こんにちは。私はそれがどのオブジェクトファイルにもないがそれらから参照されていると信じています。次に、「最終的な場所」の意味をもう少し詳しく説明してください。ソースコード内の物理アドレスまたは確定された相対アドレス。
stdout

2番目にブランチへの参照、または呼び出しテーブルについて言及していますか?
ニコス2017

26

簡単に言うと、タイプ、スコープ、サイズなどのメタデータを含む、メモリ内のアドレスに変数を割り当てる名前のマッピングです。コンパイラーによって使用されます。

これは一般的なもので、C [++] *だけではありません。技術的には、常に直接メモリアドレスが含まれるわけではありません。コンパイラが対象としている言語、プラットフォームなどによって異なります。


「常にダイレクトメモリアドレスを含んでいるわけではない」と言ってアドレスの内容を述べることはとても重要だと思います。
stdout 2016

13

Linuxでは、次のコマンドを使用できます。

nm [オブジェクトファイル]

そのオブジェクトファイルのシンボルテーブルをリストします。この出力から、使用中のリンカーシンボルをマングル名から解読できます。


8

シンボルテーブルは、プログラム/ユニット内の「シンボル」のリストです。シンボルは、ほとんどの場合、変数または関数の名前です。シンボルテーブルは、メモリ内の変数または関数が配置される場所を決定するために使用できます。



0

シンボルテーブルは、変数名、関数名、オブジェクト、クラス、インターフェイスなどのさまざまなエンティティの発生に関する情報を格納するために、コンパイラによって作成および維持される重要なデータ構造です。


リンカーとアセンブラーもシンボルテーブルを扱います(多くの場合、コンパイラーテーブルよりも単純です)。
Basile Starynkevitch 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.