Как адреса памяти назначаются во время компиляции - PullRequest
0 голосов
/ 23 июня 2019

Я новичок в этих областях, недавно я немного поиграл с отладчиком и дизассемблерами.Глядя на двоичный инструмент внутри бункера, я заметил, что у нас есть адреса памяти, назначенные ему статически.Мой вопрос: почему, если операционные системы управляют памятью (которые меняют адрес функций и т. Д. Каждый раз, когда я запускаю двоичный файл), у нас также есть статические адреса памяти в двоичном (?) Практическом примере:

Openдвоичный файл в бункере и показать, что printf находится по адресу 0x11ed, затем запустите программу в GDB и, очевидно, у нас есть printf по другому адресу.Является ли компилятор, который назначает статический адрес бинарному и почему?Любые рекомендуемые ресурсы, чтобы узнать больше?

1 Ответ

0 голосов
/ 23 июня 2019

Есть две разные вещи, которые, кажется, сбивают вас с толку.

  1. Разница между виртуальными адресами и реальными адресами памяти.Процессам назначают свое собственное адресное пространство, начиная с 0. Это не имеет отношения к реальному адресу памяти 0. Отображение управляется ОС, как правило, с помощью аппаратного обеспечения от «модуля управления памятью».Эта часть моего ответа посвящена части вопроса о «операционных системах, управляющих памятью».

  2. Динамически загружаемые библиотеки.Адрес может быть относительно такой библиотеки;сопоставление относительного библиотечного адреса с виртуальным адресом назначается во время загрузки библиотеки в адресное пространство.Языковые библиотеки времени выполнения часто распространяются как динамически загружаемые общие библиотеки.Скорее всего, это объясняет разницу в адресе между автономным запуском вашей программы и отладчиком.Я не знаю, что такое «бункер», поэтому не могу точно сказать, что он вам показывает.

...