2013-08-21 9 views
10

誰か私にlddコマンドの出力を説明することはできますか? (Gentooシステム上の)次の例では ldd出力の説明

$ ldd /bin/date 
    linux-vdso.so.1 => (0x00007fff6ffff000) 
    librt.so.1 => /lib64/librt.so.1 (0x00007f54ba710000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f54ba384000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f54ba167000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f54ba919000) 

最初の行は何を意味するのでしょうか? "linux-vdso.so.1 =>(0x00007fff6ffff000)" =は共有ライブラリファイルを指しません。

+0

[ldd出力の理解](http://stackoverflow.com/questions/5554343/understanding-ldd-output)の複製が可能です。 –

答えて

12

出力の最も重要な部分はlinux-vdsoです。 VDSOはVirtual Dynamic Shared Objectの略で、カーネル空間ルーチンをユーザー空間にエクスポートする方法です。主な理由は、システムコールのオーバーヘッドを減らすことです。通常、システムコールが発生すると、ユーザからカーネルにモードを切り替える、ユーザスペースからカーネルスペースにデータをコピーするなどの高価な操作が必要です。これらの種類のオーバーヘッドを減らすために、VDSOメモリスペースの結果を抽出するだけでVDSOが使用されます。実際のシステムコールを行わずにgettimeofday()を実行することが可能です!

すべてのシステムコールがVDSOをサポートしているわけではなく、getcpu()、gettimeofday()、time()などのシステムコールだけで、これらの処理を行うための非常に速い方法です。また、linux-vdso.so.1のメモリアドレスは無作為化されています.ldd-vdso.so.1が異なるメモリロケーションを指していることがわかります。これは誰もアドレスを前もって予測できるかのように行われています。

関連する問題