誰かがCおよびC ++のコンテキスト内にあるシンボルテーブルを説明できますか?
回答:
ここでは、シンボルテーブルの2つの一般的な関連する意味があります。
まず、オブジェクトファイルにシンボルテーブルがあります。通常、CまたはC ++コンパイラは、単一のソースファイルを、拡張子が.objまたは.oのオブジェクトファイルにコンパイルします。これには、リンカが作業アプリケーションまたは共有ライブラリに処理できる実行可能コードとデータのコレクションが含まれています。オブジェクトファイルには、シンボルテーブルと呼ばれるデータ構造があり、オブジェクトファイル内のさまざまなアイテムを、リンカーが理解できる名前にマッピングします。コードから関数を呼び出す場合、コンパイラはルーチンの最終アドレスをオブジェクトファイルに入れません。代わりに、プレースホルダー値をコードに入れ、処理中のすべてのオブジェクトファイルからさまざまなシンボルテーブル内の参照を検索して最終的な場所をそこに固定するようリンカーに指示するメモを追加します。
次に、共有ライブラリまたはDLLにシンボルテーブルがあります。これはリンカによって生成され、ライブラリのユーザーに表示されるすべての関数とデータ項目に名前を付けるのに役立ちます。これにより、システムはランタイムリンクを実行し、ライブラリがメモリに読み込まれる場所へのそれらの名前への開いた参照を解決できます。
詳細を知りたい場合は、John Levineの優れた本「Linkers and Loaders」をお勧めします。リンクテキスト
簡単に言うと、タイプ、スコープ、サイズなどのメタデータを含む、メモリ内のアドレスに変数を割り当てる名前のマッピングです。コンパイラーによって使用されます。
これは一般的なもので、C [++] *だけではありません。技術的には、常に直接メモリアドレスが含まれるわけではありません。コンパイラが対象としている言語、プラットフォームなどによって異なります。
Linuxでは、次のコマンドを使用できます。
nm [オブジェクトファイル]
そのオブジェクトファイルのシンボルテーブルをリストします。この出力から、使用中のリンカーシンボルをマングル名から解読できます。
シンボルテーブルは、プログラム/ユニット内の「シンボル」のリストです。シンボルは、ほとんどの場合、変数または関数の名前です。シンボルテーブルは、メモリ内の変数または関数が配置される場所を決定するために使用できます。
シンボルテーブルは、変数名、関数名、オブジェクト、クラス、インターフェイスなどのさまざまなエンティティの発生に関する情報を格納するために、コンパイラによって作成および維持される重要なデータ構造です。