2013-02-08 2 views
0

В Linux вы можете проверить/proc/$ PID/pmaps, чтобы увидеть библиотеки, загруженные определенной программой, и программа может открыть/proc/self/pmaps, чтобы изучить библиотеки, которые она сама загрузила.

Я знаю, что pmaps будет содержать только динамические библиотеки, и, очевидно, ядро ​​не может предсказать, какие библиотеки мы могли бы развернуть в более поздней точке, поэтому я ожидаю, что они не будут включены в/proc/self/maps. Но я уверен в нескольких других других сценариев:

  1. ли библиотеки, которые были связаны во время сборки, но мы не вызвали какой-либо функции в еще включено? Мое понимание - задержки Linux, связывающие символы до первого использования, поэтому я не уверен, что они появятся.

  2. Включены ли рэпапы во все библиотеки, используемые рекурсивно? Например. если я посмотрю на каждую библиотеку в pmaps и запустил ldd на ней, а затем запустил ldd на те, ad nauseum, я не должен находить какие-либо новые библиотеки, которые не были в исходных pmaps? Я попробовал это на двоичных файлах, и, похоже, это так, но, может быть, мне повезет.

ответ

2

ли библиотеки, которые были связаны во время сборки, но мы не вызвали какой-либо функции в еще включено?

Да: загрузчик времени выполнения будет mmap каждой библиотеки, от которой зависит ваш исполняемый файл, прежде чем ваша программа запустится.

Вы можете найти список таких библиотек, запустив

readelf -d a.out | grep NEEDED 

Содержит ли pmaps все используемые библиотеки рекурсивно?

Да: если библиотека, от которой вы напрямую зависит, зависит от какой-либо другой библиотеки, загрузчик времени выполнения также будет иметь mmap рекурсивных зависимостей.

Мое понимание задержки Linux не связывающие символы, пока они впервые используются

То есть Мостовский правильно для функции символов, но ложь для символов данных, которые не могут быть решены лениво ,

Также, независимо от того, разрешены ли эти символы лениво или нет, зависит от переменной окружения LD_BIND_NOW и от эквивалентной настройки в исполняемом динамическом разделе, управляемом флагом-линкером -znow.

Ничего из этого не меняет mmap pciture; если у вас есть DT_NEEDED запись для foo.so в вашем динамическом разделе, то foo.soбудет be mmap ed (и будет отображаться в /proc/self/*map*) независимо от ленивого или ленивого разрешения.

2

/proc/$ pid/maps - это не только список загруженных библиотек, но и ВСЕ другие сегменты памяти.

Прочитайте эту нить и статью там:

Understanding Linux /proc/id/maps

+0

Я знал об этом, но это хорошая информация, чтобы знать +1. –

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