私は、多くのテスト/検証作業がないとアップグレードできない非常に古いglibcを含む従来のシステムを持っています。
これで、このシステムで最新のプログラム(Java 1.7など)を複数回実行する必要があります。私は必要なすべてのライブラリをパッケージ化し、chrootでサービスを実行するchrootソリューションを選択しました。
ただし、chrootは非常に制限されているため、問題を解決するにはLD_LIBRARY_PATHを使用することをお勧めします。残念ながらlibc.so.6: cannot handle TLS data
、これを試してみるとエラーが発生します。
/lib/ld-linux.so.2
chrootでもそれが必要であることがわかりました。これは働きます:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
ただし、バイナリの名前が「bin / java」ではない場合、ライブラリがロードされている場所をjava
確認してこれを防ぐ方法は失敗します。/proc/self/cmdline
javaは起動時にも独自に実行されるため、状況はさらに複雑になります。
これを行うための最後の試みとして、16進エディタを使用してJavaバイナリを開き、文字列を次のよう/lib/ld-linux.so.2
に置き換え/home/chroot/ld.so
(シンボリックリンクにしたld-linux.so.2
)動作しました!
しかし、それぞれの新しいバイナリのパスをネストされたシステムの絶対パスに書き直すのは非常に面倒です。
カスタムライブラリパスを使用するより明確な方法を知っている人はいますか?含むld-linux.soをカスタマイズしますか?
答え1
16進エディタを使用して発見したように、ローダのパスはバイナリにコンパイルされます。実際には/lib/ld-linux.so.2
長/home/chroot/ld.so
さが同じなので、幸運にもバイナリファイルを直接編集できます。これらの文字列の長さはバイナリファイルにもあるため、文字列を直接変更すると微妙な問題が発生する可能性があります。
このパスを選択したら、次の点を見てください。パヘルフ通訳を更新してください。これにより、通訳者を迅速かつ安全かつ恒久的に変更することができます。