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