[root@wdctc1281 bin]# ldd node
linux-vdso.so.1 => (0x00007fffd33f2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f70f7855000)
librt.so.1 => /lib64/librt.so.1 (0x00007f70f764d000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f70f7345000)
libm.so.6 => /lib64/libm.so.6 (0x00007f70f7043000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f70f6e2d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f70f6c10000)
libc.so.6 => /lib64/libc.so.6 (0x00007f70f684f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f70f7a61000)
最初の行と最後の行はどういう意味ですか?彼らは通常のようには見えません
xxxx.so => /lib64/xxxxx.so (0xxxxxxxxxxxxxxxxxxxx)
フォーマット。
最初の行はVDSOです。これについては、 vdso(7)マンページ で詳しく説明されています。基本的には、カーネルに埋め込まれ、新しいプロセスが実行されるたびに自動的にロードされる共有ライブラリです。そのため、右側にファイルシステムパスがありません-ありません!ファイルはカーネルメモリにのみ存在します(100%正確ではありませんが、詳細についてはmanページを参照してください)。
最後の行はELFインタープリターです。これについては、 ld.so(8)マンページ で詳しく説明されています。フルパスがある理由は、プログラムにフルパスがハードコードされているためです。右側にエントリがない理由は、(直接)リンクされていないため、検索が実行されなかったためです。これは、次のコマンドを実行して確認できます。
$ readelf -l node | grep interpreter
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$ scanelf -i node
ET_EXEC /lib64/ld-linux-x86-64.so.2 node
他のすべての行は、リンクしたライブラリです。ファイルに対してDT_NEEDED
を実行すると、readelf -d
タグを確認することでそれらを確認できます。これらのファイルにはフルパスがないため、ld.soは動的パス検索を実行する必要があります。 「libdl.so.2
が必要なので、検索したところ、/lib64/libdl.so.2
で見つかりました(そして、アドレス0x00007f70f7855000
でメモリにロードされました)」
ldd filename
は、ファイルで使用されるプログラム共有ライブラリを表示します。
たとえば、libc.so.6はlibc共有オブジェクトバージョン6であり、/ lib64にあり、そのメモリ位置は0x00007f70f684f000です。
最後の行では、/ lib64の下にあるld-linux-x86-64.soバージョン2について説明しています。このフェローは、共有ライブラリnode
のニーズを見つけてロードします。それらのライブラリを準備して実行します。したがって、非常に大雑把に言えば、ld-linux-x86-64がランナーです。 libc.so.6などがロードされ、ldd
はそれらの共有ライブラリの場所とメモリの場所を示します。それが私の理解です。