「シンボルのエクスポート」という用語を探していました。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。