Как загрузить программу в память по адресу, отличному от того, для которого она предназначена?
Обычно двоичные файлы программы пользователя загружаются по низкому адресу (обычно около 0x400000
) в адресном пространстве программ, которое будет указано в elf
бинарный (в случае с linux).
Можем ли мы заставить бинарный файл пользователя загружаться по высокому адресу, возможно, в пределах 2GB
диапазон адресов где libc
или другие такие библиотеки загружаются?
Я попытался найти решение в сети, но не смог найти никакого конкретного решения для этого.
(Я работаю на Ubuntu 12.10 64bit OS)
Спасибо
1 ответ
Если двоичный файл не является позиционно-независимым (PIE), это невозможно. Обычные (не PIE) двоичные файлы жестко запрограммированы для конкретного адреса загрузки во время соединения, и во время соединения информация, необходимая для перемещения на другой адрес, уже была потеряна.
Изменить: выше предполагается, что вы работаете с существующим двоичным файлом. Если вы сами создаете двоичный файл, вы можете контролировать адрес загрузки, который жестко запрограммирован в нем, с помощью следующих параметров ссылки:
-Wl,-Ttext-segment,0x80000000
замена 0x80000000
по вашему желаемому адресу. Определенные адреса (например, зарезервированные для использования ядром, обычно начинающиеся с 0xc0000000) не будут работать, и адрес должен быть выровнен по странице (последние 3 шестнадцатеричных цифры должны быть 0).