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.1
およびld-linux.so.2
が他のエントリとは異なる理由を説明できますか?彼らの役割は何ですか?
リクエストされたライブラリlibm.so.6
ファイルで見つかった/lib/libm.so.6
、たとえば、しかし、2つの外れ値について尋ねています。
なぜ表示が異なるのですか?にとって linux-gate.so.1
これは実際にはディスク上のファイルではないためです。システムコールを行うためのメカニズムとしてカーネルによって公開されています。にとって /lib/ld-linux.so.2
これは、アプリケーションを実際に実行するために使用されるprogramインタープリターであるためです。
かなり良い ブログエントリ があり、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]