7

ライブラリがあるとします- foo.so 。(このライブラリが必要な) バイナリをビルドするときは、(1) foo.so をリンクするか、(2) プログラムのソース コード内でこのライブラリを dlopen してから、このライブラリが提供する関数を呼び出すことができます。

ライブラリから関数を呼び出した場合、(1) と (2) のパフォーマンスに違いはありますか? 異なる初期化特性 ( dlopen のコスト、シンボルの最初の使用のオーバーヘッドなど) があることは承知していますが、定常状態では、両方の選択肢が同じくらい高速ですか、それともどちらかが高速ですか?

ありがとう。

4

1 に答える 1

6

lib*.soライブラリがコンパイルgcc -Wall -fPIC -O2およびリンクされた共有オブジェクト (つまり、何らかのファイル) でgcc -sharedある場合、それはELF 位置独立コード共有ライブラリです。

PIC は、PIC を容易にするアドレッシング モードを備えた 64 ビット x86-64 よりも、レジスタが少ない 32 ビット x86 では少しコストがかかります。

それがdlopen-ed であるか、動的にリンクされている場合でも、(安定した状態で) パフォーマンスは同じです。どちらの場合も、実際のリンクは動的リンカーによって行われるため(例: ld-linux.so) sinelibdl.soは基本的に動的リンカーのラッパーです。

呼び出されたときのパフォーマンスに関して重要なのは、 内のコードでありlib*.so、それをリンクしたりリンクしたりしても変更されませんdlopen

ライブラリが静的にリンクされている場合は、状況が少し異なる可能性がありますlib*.a。最近の GCC コンパイラのリンク時間最適化機能を使用して、ライブラリとプログラムの両方をコンパイルしてリンクすることもできます (コンパイルしてリンクします) 。gcc -flto -Wall -O2

Drepper のHow to Write Shared LibraryペーパーとProgram Library HowToおよびLevine の Linkers & Loaders book を読んでください。

于 2013-08-07T05:20:04.850 に答える