Объяснение вывода ldd

Может кто-нибудь объяснить мне вывод команды ldd? В следующем примере (в системе Gentoo)

$ 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 = > не указывает на какой-либо файл общей библиотеки.

Ответ 1

Наиболее важной частью этого вывода является linux-vdso. VDSO означает Виртуальный динамический общий объект - это способ экспорта программ пространства ядра в пользовательское пространство. Основная причина заключается в уменьшении служебных расходов системного вызова. Обычно, когда происходит системный вызов, для этого требуются некоторые дорогостоящие операции, такие как режим переключения от пользователя к ядру, копирование данных из пользовательского пространства в ядерное пространство и т.д. Чтобы уменьшить эти виды служебных данных VDSO, просто прочитав, что результат vdso памяти может быть извлечен, т.е. возможно, чтобы gettimeofday() без реального системного вызова!

Обратите внимание: не все системные вызовы поддерживают VDSO, только системные вызовы, такие как getcpu(), gettimeofday(), time() и т.д., что является чрезвычайно быстрым способом добиться этой цели. Также адрес памяти linux-vdso.so.1 байт рандомизирован, при разном вызове ldd вы увидите, что linux-vdso.so.1 указывает на другое расположение памяти. Это сделано так, как будто никто не может предсказать адрес вверх.