15

「シンボルのエクスポート」という用語を探していました。C/C++ またはライブラリ (共有/静的) に関して、シンボルのエクスポートとはどういう意味ですか? シンボルをエクスポートする場所とその理由は? コンパイラによるマングリングという名前のシンボルのエクスポートとの関係は?

4

1 に答える 1

30

シンボルをエクスポートするということは、他のモジュールによってインポート (= リンク) できるように、オブジェクト ファイル/ライブラリ内のその存在とその場所を「宣伝」することを意味します。

リンクは静的または動的に行うことができますが、どちらの方法でも、リンカーはシンボルが何であるか、どこにあるかを知っている必要があり、エクスポートされたシンボルとインポートされたシンボルが一致する必要があります。名前のマングリングはそれに関連しています (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

于 2012-06-05T19:38:35.953 に答える