2013-11-14 18 views
23

私はldd programを実行すると、私は、フォームld-linux.so.2とlinux-gate.so.1とは何ですか?

linux-gate.so.1 => (0xb77ae000) 
    libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000) 
    libm.so.6 => /lib/libm.so.6 (0xb7691000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000) 
    libc.so.6 => /lib/libc.so.6 (0xb74c2000) 
    /lib/ld-linux.so.2 (0xb77af000) 

の出力を取得し、あなたは異なった他のエントリより出力と理由linux-gate.so.1ld-linux.so.2ショーを説明できますか?彼らの役割は何ですか?

答えて

40

希望のライブラリlibm.so.6の場合は、ファイル/lib/libm.so.6で見つかったが、2つの異常値について質問しているメインエントリについては尋ねないことを願っています。

なぜ異なって表示されますか? linux-gate.so.1の場合は、実際にはディスク上のファイルではないため、システムコールを行うためのメカニズムとしてカーネルに公開されているからです。 /lib/ld-linux.so.2の場合は、実際にアプリケーションを実行するために使用されるプログラムインタープリタであるからです。

blog entryは、linux-gate.soを説明していて、かなりうまく説明しています。

/lib/ld-linux.so.2については、ELFバイナリを起動するときに何が起こるかを理解する必要があります。簡単な答えは、これらのタイプのバイナリのカーネルハンドラがアプリケーションを起動するためにこのファイルを使用することです。

このプログラムの主な目的は、バイナリをメモリにマップし、プログラム内の参照されたライブラリ(たとえば、前述のlibm.so.6)をロードし、バイナリの開始アドレスに制御を渡します実行される。

このプログラムは、プログラムヘッダーのINTERPセクションにあるELFファイルの構造の一部として定義されています。 32ビットのLinuxバイナリの場合、これは32ビットインタープリタの典型的な名前です。 64ビットバイナリの場合、通常はld-linux-x86_64.so.2(64ビットx86プラットフォーム用)と呼ばれています。

INTERP   0x0000000000000238 0x0000000000400238 0x0000000000400238 
       0x000000000000001c 0x000000000000001c R  1 
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
+0

「実行時インタプリタを」:あなたは自分でreadelf -lを使用してこの情報、およびINTERPの部分を決定することができ

?あなたはそれを詳しく説明できますか? –

+2

お詫び申し上げます、専門用語は* program * interpreterです - 私はそれがしている仕事の大部分を詳述した段落を追加しました – Petesh

+0

ありがとう、私が目指していた混乱をまったくクリアしました:)。 ELFのセクションを見て混乱が起こるかもしれないことをあなたが説明してもうれしいですが、私はそれを知らなかったのです。 –

関連する問題