Как загрузить программу в память по адресу, отличному от того, для которого она предназначена?

Обычно двоичные файлы программы пользователя загружаются по низкому адресу (обычно около 0x400000) в адресном пространстве программ, которое будет указано в elf бинарный (в случае с linux).

Можем ли мы заставить бинарный файл пользователя загружаться по высокому адресу, возможно, в пределах 2GB диапазон адресов где libc или другие такие библиотеки загружаются?

Я попытался найти решение в сети, но не смог найти никакого конкретного решения для этого.

(Я работаю на Ubuntu 12.10 64bit OS)

Спасибо

1 ответ

Решение

Если двоичный файл не является позиционно-независимым (PIE), это невозможно. Обычные (не PIE) двоичные файлы жестко запрограммированы для конкретного адреса загрузки во время соединения, и во время соединения информация, необходимая для перемещения на другой адрес, уже была потеряна.

Изменить: выше предполагается, что вы работаете с существующим двоичным файлом. Если вы сами создаете двоичный файл, вы можете контролировать адрес загрузки, который жестко запрограммирован в нем, с помощью следующих параметров ссылки:

-Wl,-Ttext-segment,0x80000000

замена 0x80000000 по вашему желаемому адресу. Определенные адреса (например, зарезервированные для использования ядром, обычно начинающиеся с 0xc0000000) не будут работать, и адрес должен быть выровнен по странице (последние 3 шестнадцатеричных цифры должны быть 0).

Другие вопросы по тегам