2016-11-04 1 views
0

質問は本当にすべてそれを言う。これはなぜ私が自分の好奇心のために、これを避けるべきなのか誰かが特定の理由を知っているかどうかを知るためのものです!C++アプリケーションビルドにリンクされている未使用の動的に読み込まれたライブラリを残すことの落とし穴は何ですか?

ライブラリ関数が呼び出されなくても、コンパイラはロードコードを生成し、使用されなくてもライブラリをロードします。私はここで推測しているが、実際にどのような意味があるのか​​を知ることに興味があるだろう!

ありがとうございます!

答えて

1

プログラムの起動時に、ライブラリがロードされるはずです。これはメモリの使用量と時間の影響を開始する(私はどのように小さな/大きな影響を言っていない)です。これは、Microsoftのツールチェーンを持つWindowsの標準的なケースであり、this answer to another questionを理解しているように、Linuxでもそうです。

これは、WindowsでLoadLibraryを使用する場合とは異なることに注意してください。 LoadLibraryは、ビルド時にリンクせずに、実行時に明示的にロードして動的ライブラリを使用するWindows機能です。

Microsoftツールチェーンでは、Dllを遅延ロードするようにオプションで指定できます。これを行うと、dllを使用しない限り、dllは実際にはロードされません。ツールチェーンは、ビルド時間dllリンクをオンデマンドで実行時ロードに置き換えることでこれを行います。

0

LoadLibraryを呼び出さないでDLLを自動的に遅延ロードする場合、落とし穴はありません。

https://msdn.microsoft.com/en-us/library/hf3f62bz.aspx

ライブラリが実際にロードされている場合は、DllMainのが呼び出されます。 DllMainにバグや悪質なコードが含まれていると、何かが起こる可能性があります。

+0

私は同じ原理がLinux環境の.soファイルに適用されると仮定していますか? –

+0

IIRC DllMainはlinuxでは_init()と呼ばれます。 –

1

少なくともLinuxでは、ローダーがライブラリをロードすると、動的再配置(ヒット1)の解決に時間がかかります。また、未使用のライブラリをメモリに置くと、その後にロードされるライブラリ(ヒット2)のシンボル分解能が低下します。最後に、ローダーは、時間を消費し(ヒット3)、レイジーローディングを効果的に無効にする(ライブラリ内で定義された関数を呼び出すことで、それらが強制的に解決されるように、ロードされたすべてのライブラリ(通常はC++のコンストラクタですが、ローダー)(ヒット4)。

最近のLinuxのツールチェーンには、使用されていない動的依存関係を自動的に取り除くための良いフラグ-Wlがあります(推移的な依存関係のために必ずしも直接的なものではありませんが、

関連する問題