Java JDKの依存関係リストにlibjli.soパスがない、Debian


8

私はchroot刑務所の作成をスクリプト化しています。その自動化の一部には、さまざまな実行可能ファイルとその依存関係を刑務所にコピーすることが含まれます。次のbash行を使用して、依存関係のリストからファイルパスを解析しています(Javaなど)。

$ ldd `which java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

これはNode.jsとPythonに最適ですがjava、jail内から実行しようとすると、エラーが発生します。

java:共有ライブラリのロード中にエラーが発生しました:libjli.so:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません

libjli.soパスが依存関係のリストから欠落していることがわかります...少なくともldd私たちを示すもの(5行目):

$ ldd `which java`
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

ファイルを見つけました...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so

...しかし、なぜと表示されなかったのか知りたいのですがldd。どうやら既知の依存関係ですが、経路は不明ですか?どんな助けでもありがたいです!


興味深い質問です。openjdkフォーラムで質問してみてください。
Faheem Mitha、2014年

誰かがこれをグーグルから見つけた場合:unix.stackexchange.com/questions/16656と重複している可能性があり、詳細情報(および異なる回答)があります。
yshavit 2015

回答:


7

/etc/ld.so.conf*やldconfigをいじることなく、そのまま使用できるはずです。簡単に実行できます。/ procをchrootにマウントするだけです。これは、実ルートfsの/ etc / fstabの次の行で行います。

/ proc / var / chroot / ia32 / proc none bind

したがって、それを実際の/ procにバインドします。

パーhttps://github.com/cedric-vincent/PRoot/issues/9、ld-linux.so(私はそれがあると思います)は/ proc /自己を見て、objdumpの-pのRPATHエントリに置換する$ ORIGINを決定/ EXE。

私はこれに何回噛まれ、再発見しなければなりませんでしたか?ああ、力強く賢明なGoogleよ、次回は私をここに迅速に連れて行ってください。そうすれば、future-meは過去のmeの膝で再び学ぶことができます!


1
ありがとう。あなたの指さし/proc/self/exeは、私の側の行方不明の手がかりでした。/proc私のchrootにマウントするとうまくいきました。
Tino、2015

3

追加する必要があるようです

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

/etc/ld.so.conf、または/etc/ld.so.conf.d内の新しいファイルの可能性が高いです。次に、実行ldconfigしてキャッシュを更新しldd、ライブラリを見つけます。

chrootのスクリプティングについては、パッケージベースのアプローチをとることで、基本的なインストールを最初に作成し(たとえば、Debianベースのホストでdebootstrapを使用して)、次に必要なパッケージをインストールすることで、長期的には痛みが少なくなります。これにより、パッケージマネージャーは、依存関係の解決、必要なすべてのファイルのインストール、ポストインストールタスクの実行など、すべての作業を処理できます。


そして、それがld.so.confまたは含まれているファイルの1つになかった理由を教えてください。OSはインストール中にそこに配置する必要がありますか?
リップリープ、2014年

いいえ、わかりません。Ubuntu 14.04ホストでも同じ結果が表示されますが、Javaは正常に起動します。したがって、実行時に動的に依存関係を解決する必要があります。
Andrew Schulman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.