3

私は共有ライブラリを使用してC++に取り組んでいます。

現在、「LD_PRELOAD」を使用しており、setenv()呼び出しを使用してこの環境変数を設定しています。
しかし、共有ライブラリをロードするためにdlopen()APIを使用したいと思います。これは、setenv()を使用して環境変数(つまりLD_PRELOAD)を設定するのと同じように機能するはずです。

dlopen()を使用して上記の要件を取得できますか?または、LD_PRELOADとdlopen()を使用したライブラリの読み込みに違いがありますか?

4

1 に答える 1

3

これについて100%確信はありませんが、を使用LD_PRELOADすると、プログラムローダーがすべてのライブラリを最初にロードし、次にアプリケーションで指定されたライブラリをロードしLD_PRELOAD、最後にアプリケーションをロードします。これにより、システムライブラリを独自のものでオーバーライドできます。

を使用dlopenすると、プログラムのロード後に共有オブジェクトがロードされるため、システムオブジェクトをオーバーライドするために使用することはできません。

プログラムが正しく機能するために環境変数を設定する必要がある場合は、シェルまたはLD_PRELOADファイルのいずれかでプログラムをロードする前に設定する必要があります。プログラムが環境変数をすぐに必要としない場合は、プログラムで設定するか、によってロードされた共有オブジェクトの「on-load」関数で設定できますdlopen

于 2013-02-20T12:37:37.613 に答える