2011-11-04 4 views
6

ここに私が持っているシナリオがあります:chrootはどのように動的リンクに影響しますか?

私はdebootstrap ubuntu maverick(64-bit)環境を作成しました。私はそれを私のubuntu(64ビット)明快なシステムの/env/mav/に置いた。私はchroot/env/mavに入れることができ、完璧なシステムを完全に利用することができます。

私はchrooted環境の外でlucidプログラムをうまく使うことさえできます。つまり、/env/mav/bin/lsが実行されます。

しかし、私はLD_LIBRARY_PATHを変更した場合であることを気づい/env/mav/lib [1] [2]私は即座にクラッシュします実行

すべての単一のプログラム(明快と異端の両方)。 (例:lsはsegfaultになります)。 kern.logショー:はっきり/env/mavにI chroot場合

segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15 

しかし、すべてのプログラムが正常に実行されています。そして、すべての図書館が刑務所から読み込まれているだけではない(/env/mav/lib?この場合、chrootと変更するLD_LIBRARY_PATHの違いは何ですか? I場合

はさらに、:

mount -B /env /env/mav/env 

、その後chroot /env、その後/env/mav/libするLD_LIBRARY_PATHを設定し、すべてがまだ正常に動作します。

私は内部的に何が起こっているのか迷っています。どこかに格納されている内部構造がありますか? chrootは何か魔法をしますか?

[1]ユビキタス環境のプログラムを、正確に拘束された動的ライブラリに変換することです。

[2]これは、ほんの一例です。実際には/usr/libなどがすべて含まれています。まじめな環境の/ libの "毒"のすべてを含む;他の独立したライブラリディレクトリを使用しても問題はありません。

答えて

6

LD_LIBRARY_PATHは、ld-linux.soプログラム/ライブラリのオプションです。このライブラリはダイナミックリンカーです。それは、パス "/lib/ld-linux.so.2"は、ubuntuのELFヘッダー(INTREPフィールド)に(ほとんど)動的にリンクされたすべてのプログラムにハードコードされています。私は、Linuxカーネルがバイナリファイルを実行するとき、LD_LIBRARY_PATHの特別な意味について何も知らないことを意味します。あなたは

LD_LIBRARY_PATH=/env/mav/ /env/mav/bin/ls 

を実行したときに

だから、(あなたは何を見ることができ、ルートシステムの場合には/lib/ld-linux.so.2が使用が使用され、それが$LD_LIBRARY_PATHのenv変数を使用して動的ライブラリを解決しようとしますLD_DEBUG=allのenv変数を使用しています)

chrootを実行すると、不正者の/lib/ld-linux.so.2が使用されます。

(LD-Linuxはglibcを/ eglibcパッケージの一部であり、それはlibc.soから何かを使用しているため)私が思うに、ホストシステムのld-linuxとゲスト(マーベリック)システムのlibc.soの間にいくつかのincompabilityがあることができます。(ENV変数の設定bashの構文)を実行しようと、私の仮説をテストするには

ここ
LD_LIBRARY_PATH=/env/mav/ /env/mav/lib/ld-linux.so.2 /env/mav/bin/ls 

私は(はい、このINTREPハードコードされたパスを上書きするために、手動でゲストのLD-Linuxが起動しよう.soライブラリを実行するのはかなり珍しいようですが、このライブラリは非常に特殊なケースであり、この構文が可能です。このコマンドがうまくいくなら、私の前提は良いかもしれません。もしそうでなければ、他の説明が可能です。

+0

Linuxリンキングシステムの仕組みについての説明をありがとう。完璧に働いた。 – UsAaR33

+4

libpthread.soをlibc.so(LD_DEBUGを使用)にリンクしてクラッシュが発生しています。 ld.so --listによって来る将来の人々に注意するには、異なるリンカーでlddを行うことができます。 – UsAaR33

関連する問題