これは、オペレーティング システムのような UNIX に固有の回答です。質問の意味をなさない場合は申し訳ありませんが、プラットフォームはよくわかりません。動的にリンクされた実行可能ファイルを作成しないでください。
これを行うには2つの方法が考えられます。方法 2 がおそらく最適です。どちらも似ています。
両方にとって重要です。実行可能ファイルは、ビルド時に使用して静的にコンパイルする必要があります-static
- 方法 1 - 静的な exe、信頼できるフル パスによる共有ライブラリの手動ロード
dlopen
フルパスを介して必要な各ライブラリを手動dlsym
で実行し、実行時に関数アドレスを取得し、それらを関数ポインターに割り当てて使用します。使用するすべての外部関数に対してこれを行う必要があります。再入可能で安全でない関数はこれを好まないので、静的変数を使用する場合は、再入可能で安全なバージョンを使用する必要があります。これらは「_r」で終わります。つまり、strtok_r
代わりに使用しますstrtok
これは、アプリの機能と使用している機能の数によって、難しい場合と簡単な場合があります。
- 方法 2 - 実行可能ファイルを静的にリンクする、ピリオド
動的ライブラリをまったく使用しないように静的実行可能ファイルをリンクするだけで、Subversion の問題を解決できます。dlopen()/dlsym()
これにより、メソッドよりもはるかに大きな exe が生成されます。compile フラグを使用してビルドし、使用する-static
代わりに、たとえばgcc bah.c -o bah lssl
使用gcc -static bah.c -o bah /usr/lib/libssl.a
して、動的共有ライブラリの代わりに必要なライブラリの静的にコンパイルされたバージョンを使用します。つまり、ビルド中に使用する場合と使用-static
しない場合-l
どちらの方法でも:
- ビルドしたら
file bah
、実行可能ファイルが静的にリンクされていることを確認するために使用します。または、実行ldd
して確認します
- システムに存在する、リンクしているすべてのライブラリの静的にコンパイルされたバージョンが必要になることに注意してください。これらのファイルは、
.a
代わりに.so
)で終わります
- また、システム ライブラリをアップグレードしても、実行可能ファイルは更新されないことに注意してください。OpenSSL に新しいセキュリティ バグがある場合は、最新の libssl.a を入手して再コンパイルする必要があります。この方法を使用すると、
dlopen()/dlsym()
この問題は発生しませんが、異なるバージョンでシンボルが変更された場合、移植性の問題が発生します
各方法には、ニーズに応じて長所と短所があります。
方法 1dlopen
とdlsym
アプローチを使用すると、コードがより「難読化」されて小さくなりますが、ほとんどの場合、移植性が犠牲になるため、おそらくあなたが望むものではありません。利点は、セキュリティ バグがシステム全体で修正された場合に役立つ可能性があることです。