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