2013-08-21 123 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

[Understanding ldd output]的可能重複(http://stackoverflow.com/questions/5554343/understanding-ldd-output) – 2014-06-06 02:30:15

回答

12

該輸出最重要的部分是linux-vdso。 VDSO代表Virtual Dynamic Shared Object - 這是將內核空間例程導出到用戶空間的一種方式。主要原因是減少系統調用開銷。通常當發生系統調用時,它需要一些昂貴的操作,如從用戶切換到內核,將數據從用戶空間複製到內核空間等。爲了減少這些開銷,使用VDSO,只需讀取vdso內存空間即可提取結果,即可能gettimeofday()沒有做一個真正的系統調用!注意,並非所有的系統調用都支持VDSO,只有像getcpu(),gettimeofday(),time()這樣的系統調用是完成這些任務的極其快捷的方式。另外內存地址linux-vdso.so.1是隨機的,在不同的ldd調用你會看到linux-vdso.so.1指向不同的內存位置。這已經完成,好像沒有人可以預先預測地址。