2013-08-21 3 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)« The => не указывает на какой-либо файл общей библиотеки.

+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 вы увидите, что linux-vdso.so.1 указывает на другое расположение памяти. Это было сделано так, как будто никто не может предсказать адрес вверх.

Смежные вопросы