3

LD_LIBRARY_PATH(LD_LIBRARY_PATH = / home / user1 / lib; / opt / myprog / lib)で指定した順序に関係なく、共有ライブラリのlibmyworld.soが/ opt / my_prog/libと/home/ user1/libにあります。私のバイナリは常にlibmyworld.soを/opt/ my_prog/libで最初に探す必要があります。

これは、コンパイル時にGCCを使用して実行できますか?my_progバイナリを変更せずに。前もって感謝します。

4

4 に答える 4

6

Linux での動的ライブラリの検索順序 (ld.so man ページから) は次のとおりです。

  • 存在し、DT_RUNPATH 属性が存在しない場合、バイナリの DT_RPATH 動的セクション属性を使用します。DT_RPATH の使用は非推奨です。
  • 環境変数 LD_LIBRARY_PATH を使用します。実行可能ファイルが setuid/setgid バイナリである場合を除き、その場合は無視されます。
  • 存在する場合、バイナリの DT_RUNPATH 動的セクション属性を使用します。
  • 拡張ライブラリ パスで以前に見つかった候補ライブラリのコンパイル済みリストを含むキャッシュ ファイル /etc/ld.so.cache から。ただし、バイナリが -z nodeflib リンカー オプションでリンクされた場合、デフォルトのライブラリ パス内のライブラリはスキップされます。
    • デフォルト パス /lib、次に /usr/lib。バイナリが -z nodeflib リンカー オプションでリンクされている場合、この手順はスキップされます。

リンク時に設定する

  • DT_RUNPATH: -Wl,--enable-new-dtags -Wl,-R$(RUNPATH) を使用
  • DT_RPATH: -Wl,--disable-new-dtags -Wl,-R$(RPATH) を使用

理論的には、ユーザーが制御できる LD_LIBRARY_PATH が優先されるため、DT_RUNPATH を使用することをお勧めします。ただし、ここではユーザー コントロールを避けたいので、DT_RPATH を使用します。リンク行で:

-Wl,--disable-new-dtags -Wl,-R/opt/my_prog/lib
于 2012-11-29T10:25:10.413 に答える
0

ソースコードをコンパイルするときは、次のコマンドを使用しますgcc -o [desired_executable_file_name]-L[共有ライブラリパス]-l[共有ライブラリ名]-I[ヘッダーファイルパス]

たとえば、あなたの場合、gcc -o my_word_exe -L / opt / my_prog / lib -lmyworld-I[ヘッダーパスの場合]

次に、このパスの/ opt / my_prog/libにあるlibmyworld.soを使用します

于 2012-11-29T12:05:45.290 に答える
0

いつでもバイナリ(ここではfooと呼ばれます)を起動できます

$ LD_LIBRARY_PATH=/opt/my_prog/lib foo

または、上記の行でシェル スクリプトを作成します。

于 2012-11-29T09:35:18.290 に答える
-2

LD_PRELOADを使用します。

LD_PRELOAD=/home/lib/libmyworld.so mybinary

利点は、LD_LIBRARY_PATHをいじらないことです。バイナリは他の共有ライブラリに依存している可能性があり、適切なが必要な場合がありますLD_LIBRARY_PATH/ld.so.conf/whatever

PS。これは、他のライブラリのロードに影響を与えず、ユーザーの実行可能ファイルにパスをハードコーディングしないため、最も侵襲性が低く柔軟なソリューションです。

于 2012-11-29T09:49:59.800 に答える