#c #memory #heap-memory
#c #память #куча-память
Вопрос:
(Этот вопрос касается только логических адресов)
Я экспериментировал с некоторым кодом, в котором я печатал адреса разных типов / областей переменных, чтобы лучше визуализировать изображение процесса.
Мое замешательство возникло, когда я напечатал адреса нескольких переменных, которые были выделены в куче с помощью malloc, а затем также напечатал адрес функции printf из любопытства.
Что я обнаружил, так это то, что printf хранился по гораздо более высокому адресу (т. Е. ближе к стеку) в куче, чем мои переменные, выделенные malloc. Для меня это не имеет смысла, потому что я предполагал, что библиотечные функции будут загружены в кучу первым делом во время выполнения, прежде чем будут выполнены какие-либо другие инструкции. Я даже поместил оператор printf перед любыми операторами malloc на случай, если библиотечные функции загружались «на лету» по мере необходимости, но это ничего не изменило.
Спасибо.
Комментарии:
1. При управлении виртуальной памятью нет причин иметь какие-либо ожидания относительно адресов стека, кучи и кода. И на самом деле, рандомизация компоновки адресного пространства (ASLR) специально разработана для предотвращения попыток прогнозирования отношений адресов.
Ответ №1:
(Этот ответ касается только Unix. Я не знаю, как это происходит в Windows.)
Большинство совместно используемых библиотек загружаются в оперативную память до того, как управление достигнет main
, и библиотека, содержащая printf
, определенно будет. Функции в dlfcn.h
могут использоваться для загрузки большего количества совместно используемых библиотек во время выполнения программы, это самое важное исключение.
Разделяемые библиотеки никогда не загружались как часть «кучи», если под этим вы подразумеваете область памяти, используемую для удовлетворения malloc
запросов. Они загружаются с использованием системного примитива mmap
и могут быть размещены вообще где угодно в памяти. Как указал пользователь3386109 в комментарии к вопросу, в современных системах их местоположения намеренно рандомизированы в качестве контрмеры для различных эксплойтов.