2013-09-10 1 views
1

Я пытаюсь написать свой собственный загрузчик. В этой программе я скопирую программу на конкретный адрес в ОЗУ и перейду к адресу точки входа, читая точку входа эльфа. Но я не могу понять, что такое адрес загрузчика? Означает ли это, что двоичный файл нужно копировать только по адресу загрузчика, указанному во время компиляции. не могу ли я загрузить программу в другом месте, а не в адрес загрузки, указанный во время компиляции? Мой основной вопрос заключается в следующем: «Не могу ли я загрузить программу в другом месте, а не в адрес загрузки, указанный во время компиляции?»Является ли адрес загрузки во время компиляции местом, где мне нужно скопировать exectuable в ОЗУ?

ответ

1

Точно.

Полностью связанные программы ELF не содержат информации о перемещении, которая позволила бы вам исправить ссылки после загрузки программы по другому адресу.

Использование опции -Ur для компоновщика (или соответствующего скрипта компоновщика), вы можете сгенерировать ELF-файл с перестановками, но писать загрузчик для них сложнее.

+0

Мой основной вопрос заключается в следующем: «Не могу ли я загрузить программу в другом месте, а не в адрес загрузки, указанный во время компиляции?» –

+2

И основным ответом является «не без исправления ссылок после загрузки». – Sneftel

0

Вам нужно понять формат файла ELF, который немного сложнее. Вы можете найти и просмотреть на сайте Wikipedia.

После SO сообщения могут быть актуальны:

1

Вы ориентируетесь ARM, случайно?

Решение проблемы PIC/PIE (независимый от положения код/​​исполняемый файл). Таким образом, программа составлена ​​следующим образом:

  • любой в-функции скачки делаются относительными (такие вещи, как IFS, футляры, петля и т.д.)
  • любых внутри раздела скачки сделаны косвенно в два этапе с использованием GOT (Global Offset Table)
  • между раздел скачки относительно или косвенные, в зависимости от линкера аргумента «длинные прыжки»
  • любой глобальный доступ к данным производится косвенно с помощью ПРТ

Таким образом, программа con не содержит абсолютных адресов в любом месте кода. Он также не имеет перемещений в коде. Единственное необходимое перемещение - это размещение самого GOT.

GOT - это таблица, содержащая адреса всех глобальных объектов, функций и данных. В коде, отличном от PIC, абсолютные адреса данных встроены непосредственно внутри кода. Функция должна знать адрес таблицы GOT и номер записи в таблице GOT, соответствующей определенному объекту. Номер объекта - это единственное, что встроено в код PIC. Адрес GOT представляется функции одним из двух способов, с которыми я столкнулся: перемещение, добавленное в конце тела функции или в предопределенный регистр CPU. Я считаю, что последний вариант лучше.

PICs полезны, если у вас есть ROM с памятью, в котором ваша программа изначально загружена, и вы хотите скопировать ее в ОЗУ, чтобы ускорить работу и разрешить изменение данных.

Обратите внимание, что вы можете сделать все вышеперечисленное без ПИК, это намного больше хлопот. У вас будет много перемещений внутри кода (в случае перемещения кода функции PIC - это вопрос простой memcpy), и вам нужно скопировать все блоки данных сразу (правильно написанные исполняемые файлы PIC позволяют перемещать отдельные объекты в разных областей памяти).

Если вам интересно, то я могу отправить вам некоторые из моих сценариев компоновщика для архитектуры ARM.

+0

Да, пожалуйста, отправьте. Это будет полезно. –

+0

Дайте мне с вами контакт, не так ли? Или попробуйте отправить мне по почте: ([email protected]). – haael

+0

Мой контакт: [email protected] –

Смежные вопросы