2013-08-21 18 views
10

Czy ktoś może mi wytłumaczyć wyjście polecenia ldd? W poniższym przykładzie (w systemie Gentoo)Objaśnienie wyjścia 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) 

co to pierwsza linia oznacza? "Linux-vdso.so.1 => (0x00007fff6ffff000)" The => nie wskazuje żadnego pliku biblioteki współużytkowanej.

+0

możliwy duplikat [Rozumienie wyjścia ldd] (http://stackoverflow.com/questions/5554343/understanding-ldd-output) –

Odpowiedz

12

Najważniejszą częścią tego wyjścia jest linux-vdso. VDSO oznacza Virtual Dynamic Shared Object - jest to sposób na eksportowanie procedur przestrzeni jądra do przestrzeni użytkownika. Głównym powodem jest zmniejszenie narzutu wywołania systemowego. Zwykle, gdy następuje wywołanie systemowe, wymaga to pewnych kosztownych operacji, takich jak przełączanie z trybu użytkownika do jądra, kopiowanie danych z przestrzeni użytkownika do przestrzeni jądra itp. Aby zredukować tego rodzaju obciążenie VDSO, wystarczy odczytać, że wynik przestrzeni pamięci vdso może zostać wyodrębniony, tzn. możliwe gettimeofday() bez wykonywania prawdziwego wywołania systemowego!

Uwaga, nie wszystkie wywołania systemowe mają wsparcie VDSO, tylko wywołania systemowe, takie jak getcpu(), gettimeofday(), time() itd., Co jest bardzo szybkim sposobem na wykonanie tych czynności. Również adres linux-vdso.so.1 punktów pamięci jest losowy, w różnych wywołaniach ldd zobaczysz linux-vdso.so.1 wskazuje na inną lokalizację pamięci. Dokonano tego tak, jakby nikt nie mógł przewidzieć adresu z góry.