2

このページこのページの説明に従って、Ubuntu Linux で共有ライブラリをビルドして使用しようとしています。

ファイルをターゲット システムにコピーしてそこで実行するのではなく、PC でクロス コンパイラを使用してライブラリとアプリケーションをビルドしています。

最後に、すべてのシンボリックリンクが正しく定義され、アプリケーションを実行できる段階になりましたが、必要な形式ではありません。

libtest.so.1.0directory に共有ライブラリがあるとしましょう/home/ysap/libs。次に、シンボリックリンクlibtest.so.1libtest.so同じディレクトリに作成し、両方ともライブラリファイルを指しています。

ディレクトリには、ライブラリを使用/home/ysap/appsするアプリケーション プログラムがあります。app.etest

アプリケーションを実行するには、次のように入力します。

> LD_LIBRARY_PATH=/home/ysap/libs ./app.e

アプリケーションはうまく動作します。ただし、割り当てをなくしたいので、次のように入力してみました。

> export LD_LIBRARY_PATH=/home/ysap/libs
> ./app.e

残念ながら、次のようなエラーメッセージが表示されます。

./app.e: error while loading shared libraries: libtest.so.1: cannot open shared object file: No such file or directory

私も入力してみました:

> ldconfig -n /home/ysap/libs

> sudo ldconfig -n /home/ysap/libs

しかし、それは役に立ちません。

私は何を間違っていますか?変数の割り当てなしで app.e を実行するにはどうすればよいですか?


更新 1 :

アプリケーションはmmap()呼び出しを使用するため、sudo権限で実行する必要があります。実際の呼び出し行は次のとおりです。

> sudo LD_LIBRARY_PATH=/home/ysap/libs ./app.e

export-ed 変数がsudo環境で更新されない可能性はありますか?


更新 2 :

の出力ldd ./app.e:

libtest.so.1 => /home/ysap/libs/libtest.so.1 (0xb6faa000)
libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6f85000)
libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6ea4000)
/lib/ld-linux.so.3 (0xb6fb7000)
4

2 に答える 2

4

sudoの問題は@duskwuffが述べているとおりですが、アプリケーションをコンパイルする必要があり、LD_LIBRARY_PATH変数を変更する必要がない場合は、アプリケーションをリンクするときに$ORIGIN、Linuxの最新バージョンで認識される変数を使用できます。

すべてのライブラリが現在のディレクトリにある場合、アプリケーションをリンクするときに追加のオプションを使用します。

-Wl,-R'$ORIGIN'

コンパイル時にシェルによって展開されないようにするには、オプションを引用する必要があります。

それを a に入れている場合は、Makefile次を使用します。

-Wl,-R\$$ORIGIN

これ$$は $ を使用するための make であり\、コマンドに渡す前に変数を展開するコマンド ラインから呼び出されたシェルを防ぐためのものです。

任意のシンボリック パス参照を使用できるため、バイナリが にbin/あり、ライブラリが にある構造がある場合はlib/、 を使用できます$ORIGIN/../lib

これdlopenも同様に機能するため、実行時に動的にロードされているときにライブラリを見つけることができます

于 2012-12-05T20:08:47.317 に答える
2

ユーザー指定のパスからライブラリをロードすることはセキュリティ リスクであるsudoためLD_LD_LIBRARY_PATH.

于 2012-12-05T19:54:18.857 に答える