Я пытаюсь написать свой собственный загрузчик. В этой программе я скопирую программу на конкретный адрес в ОЗУ и перейду к адресу точки входа, читая точку входа эльфа. Но я не могу понять, что такое адрес загрузчика? Означает ли это, что двоичный файл нужно копировать только по адресу загрузчика, указанному во время компиляции. не могу ли я загрузить программу в другом месте, а не в адрес загрузки, указанный во время компиляции? Мой основной вопрос заключается в следующем: «Не могу ли я загрузить программу в другом месте, а не в адрес загрузки, указанный во время компиляции?»Является ли адрес загрузки во время компиляции местом, где мне нужно скопировать exectuable в ОЗУ?
Является ли адрес загрузки во время компиляции местом, где мне нужно скопировать exectuable в ОЗУ?
ответ
Точно.
Полностью связанные программы ELF не содержат информации о перемещении, которая позволила бы вам исправить ссылки после загрузки программы по другому адресу.
Использование опции -Ur
для компоновщика (или соответствующего скрипта компоновщика), вы можете сгенерировать ELF-файл с перестановками, но писать загрузчик для них сложнее.
Вам нужно понять формат файла ELF, который немного сложнее. Вы можете найти и просмотреть на сайте Wikipedia.
После SO сообщения могут быть актуальны:
Вы ориентируетесь ARM, случайно?
Решение проблемы PIC/PIE (независимый от положения код/исполняемый файл). Таким образом, программа составлена следующим образом:
- любой в-функции скачки делаются относительными (такие вещи, как IFS, футляры, петля и т.д.)
- любых внутри раздела скачки сделаны косвенно в два этапе с использованием GOT (Global Offset Table)
- между раздел скачки относительно или косвенные, в зависимости от линкера аргумента «длинные прыжки»
- любой глобальный доступ к данным производится косвенно с помощью ПРТ
Таким образом, программа con не содержит абсолютных адресов в любом месте кода. Он также не имеет перемещений в коде. Единственное необходимое перемещение - это размещение самого GOT.
GOT - это таблица, содержащая адреса всех глобальных объектов, функций и данных. В коде, отличном от PIC, абсолютные адреса данных встроены непосредственно внутри кода. Функция должна знать адрес таблицы GOT и номер записи в таблице GOT, соответствующей определенному объекту. Номер объекта - это единственное, что встроено в код PIC. Адрес GOT представляется функции одним из двух способов, с которыми я столкнулся: перемещение, добавленное в конце тела функции или в предопределенный регистр CPU. Я считаю, что последний вариант лучше.
PICs полезны, если у вас есть ROM с памятью, в котором ваша программа изначально загружена, и вы хотите скопировать ее в ОЗУ, чтобы ускорить работу и разрешить изменение данных.
Обратите внимание, что вы можете сделать все вышеперечисленное без ПИК, это намного больше хлопот. У вас будет много перемещений внутри кода (в случае перемещения кода функции PIC - это вопрос простой memcpy), и вам нужно скопировать все блоки данных сразу (правильно написанные исполняемые файлы PIC позволяют перемещать отдельные объекты в разных областей памяти).
Если вам интересно, то я могу отправить вам некоторые из моих сценариев компоновщика для архитектуры ARM.
Да, пожалуйста, отправьте. Это будет полезно. –
Дайте мне с вами контакт, не так ли? Или попробуйте отправить мне по почте: ([email protected]). – haael
Мой контакт: [email protected] –
- 1. Является ли nameof() оцененным во время компиляции?
- 2. Является ли утверждение, принятое во время компиляции?
- 3. Как получить адрес метки во время компиляции
- 4. Является ли перекресток во время компиляции Java полезной?
- 5. Проверьте, является ли символ или wchar_t во время компиляции
- 6. Является ли NSTemporaryDirectory в ОЗУ?
- 7. Проверьте, является ли число простым во время компиляции в C++
- 8. Является ли PowerShell узким местом
- 9. Где локальные переменные сохраняются во время компиляции?
- 10. Является ли делегат приложения подходящим местом для загрузки имени входа?
- 11. memcpy, где размер известен во время компиляции
- 12. Определены ли значения во время компиляции?
- 13. Есть ли способ загрузки в omp.h во время компиляции, поэтому машине никогда не нужно извлекать ее во время выполнения?
- 14. где включены и заголовки во время компиляции?
- 15. pthread_join является узким местом
- 16. Как мне получить модули, имена которых неизвестны во время компиляции?
- 17. Является ли gcc переупорядочением локальных переменных во время компиляции?
- 18. Является ли const двойным приложением во время компиляции?
- 19. Определить, является ли строковый/символьный символ во время компиляции
- 20. Как определить, является ли тип shared_ptr во время компиляции
- 21. Проверьте, является ли строка литеральной строкой, известной во время компиляции?
- 22. Является ли strlen (__ FILE__) оцененным во время компиляции
- 23. Определите, является ли тип контейнером STL во время компиляции
- 24. Когда мне нужно скопировать блок?
- 25. Встраивается ли во время компиляции или во время выполнения?
- 26. Отказывание во время компиляции
- 27. Где найти exectuable ./configure - PHP Debian
- 28. Оценивается ли «mem :: size_of» во время компиляции?
- 29. Являются ли время компиляции и время загрузки класса одинаковым?
- 30. Выполняется ли установка во время выполнения или во время компиляции?
Мой основной вопрос заключается в следующем: «Не могу ли я загрузить программу в другом месте, а не в адрес загрузки, указанный во время компиляции?» –
И основным ответом является «не без исправления ссылок после загрузки». – Sneftel