2013-08-21 28 views
10

Birisi bana ldd komutunun çıkışını açıklayabilir mi?ldd çıkışının açıklaması

$ 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) 

(Gentoo sisteminde) Aşağıdaki örnekte ilk satır ne demek? "Linux-vdso.so.1 => (0x00007fff6ffff000)" => herhangi bir paylaşılan kitaplık dosyasına işaret etmiyor.

+0

[ldd çıkışını anlama] 'nın olası kopyası (http://stackoverflow.com/questions/5554343/understanding-ldd-output) –

cevap

12

Bu çıktının en önemli kısmı linux-vdso'dur. VDSO, Virtual Dynamic Shared Object anlamına gelir; bu, kullanıcı alanı için çekirdek uzay rutinlerini dışa aktarmanın bir yoludur. Ana sebep, sistem çağrı yükünü azaltmaktır. Genellikle bir sistem çağrısı gerçekleştiğinde, kullanıcının kernelden kernelspace'e kopyalanması, kernelspace'den kernelspace'e kopyalama kipleri gibi bazı pahalı işlemlere ihtiyaç duyulur. VDO'ların bu çeşitlerini azaltmak için, yalnızca vdso bellek alanı sonucunun çıkarılabileceğini okuyarak, yani gerçek bir sistem çağrısı yapmadan gettimeofday() için mümkün!

Not, tüm sistem çağrıları VDSO desteğine sahip değildir, yalnızca bu tür bir şey yapmak için çok hızlı bir yol olan getcpu(), gettimeofday(), time() vb. Gibi sistem çağrıları yoktur. Ayrıca hafıza adresi linux-vdso.so.1 noktaları randomize edilmiştir, farklı ldd çağırmalarında linux-vdso.so.1 noktalarını farklı bellek konumuna göreceksiniz. Bu, ön taraftaki adresi önceden kimse tahmin edemezmiş gibi yapılmıştır.