「シンボルのエクスポート」という用語を探していました。C/C++ またはライブラリ (共有/静的) に関して、シンボルのエクスポートとはどういう意味ですか? シンボルをエクスポートする場所とその理由は? コンパイラによるマングリングという名前のシンボルのエクスポートとの関係は?
1 に答える
シンボルをエクスポートするということは、他のモジュールによってインポート (= リンク) できるように、オブジェクト ファイル/ライブラリ内のその存在とその場所を「宣伝」することを意味します。
リンクは静的または動的に行うことができますが、どちらの方法でも、リンカーはシンボルが何であるか、どこにあるかを知っている必要があり、エクスポートされたシンボルとインポートされたシンボルが一致する必要があります。名前のマングリングはそれに関連しています (C++ の名前のマングリングには、シンボル名にシンボルの型定義が含まれており、リンカーがインポートとエクスポートを正しくリンクするには、エクスポートされたシンボルとインポートされたシンボルのマングリングが一致する必要があります)。
例:
ライブラリ "STANDARDC" (ランダムな名前) とプログラム SOMEPROG があるとします。プログラム SOMEPROG はコンソールに出力する必要があるため、 を呼び出しますprintf
。しかし、実際にprintf
プログラムに SOMEPROG を実装するのではなく、それを使用 (=インポート) するだけで、実装は別の場所にあります。
ライブラリ STANDARDC には、そのライブラリに実装され、外部から呼び出すことができるすべての関数 (=エクスポートされた関数) を含む、エクスポートするシンボルのリストがあります。printf
はそのような関数の 1 つであるため、エクスポートされたリストに表示されます。
コンパイラは SOMEPROG.C を調べて、あなたが を参照していることを確認しますがprintf
、その実装はありません。コンパイラはprintf
、リンカーが実際の実装をリンクできるように、結果の SOMEPROG.obj のインポートされたシンボルのリストに を追加します。
リンカーは、SOMEPROG.obj ファイルと STANDARDC .lib ファイルを受け取り、SOMEPROG.obj で使用されている関数を確認します。リンカーはprintf
実装されていないことを検出し、インポートされているため、リンカーはすべての .lib ファイルを調べprintf
、STANDARDC のエクスポートされたリストで一致するものを見つけます。from STANDARDCの実装をprintf
取得し、インポートされたシンボルを参照するすべてのプログラムにリンクしますprintf
。