40

実行するldd programと、フォームの出力が得られます

    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は異なる方法で表示できますか? 彼らの役割は何ですか?

4

1 に答える 1

57

たとえば、要求されたライブラリlibm.so.6が file で見つかったと述べている主なエントリについて質問しているのではなく、2 つの外れ値について質問していることを願っています。/lib/libm.so.6

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

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 プラットフォームの場合) と呼ばれます。

readelf -lおよびINTERPセクションを使用して、この情報を自分で判断できます。

INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
               0x000000000000001c 0x000000000000001c  R      1
    [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
于 2013-11-14T15:47:33.327 に答える