Когда функции общей библиотеки загружаются в кучу? - PullRequest
1 голос
/ 28 марта 2019

(Этот вопрос касается только логических адресов)

Я экспериментировал с некоторым кодом, где распечатывал адреса различных типов / областей действия переменных, чтобы лучше визуализировать изображение процесса.

Моя путаница возникла, когда я распечатал адреса нескольких переменных, которые были выделены в куче malloc, а затем также из любопытства напечатал адрес функции printf.

Я обнаружил, что printf хранитсяс гораздо более высоким адресом (т.е. ближе к стеку) в куче, чем мои переменные, выделенные malloc.Это не имеет смысла для меня, потому что я предполагал, что библиотечные функции будут загружены в кучу первым делом во время выполнения перед выполнением любых других инструкций.Я даже помещал оператор printf перед любыми операторами malloc, на случай, если библиотечные функции загружались «на лету» по мере необходимости, но это ничего не меняло.

Спасибо.

1 Ответ

3 голосов
/ 28 марта 2019

(Этот ответ касается только Unix. Я не знаю, как он работает в Windows.)

Большинство разделяемых библиотек загружаются в ОЗУ до того, как элемент управления достигнет main, а библиотека, содержащая printf, определеннобудет.Функции в dlfcn.h могут использоваться для загрузки большего количества совместно используемых библиотек во время выполнения программы, это самое важное исключение.

Общие библиотеки никогда не загружались как часть «кучи», если при этом выозначает область памяти, используемую для удовлетворения malloc запросов.Они загружаются с использованием системного примитива mmap и могут быть размещены где угодно в памяти.Как указал user3386109 в комментарии к вопросу, в современных системах их расположение намеренно рандомизировано в качестве контрмеры для различных эксплойтов.

...