Как получить адрес функции printf в исполняемом файле arm

У меня есть намерение сделать загрузчик для перемещаемых файлов ARM elf. Мне удалось как-то разобрать эльфа и сделать несколько простых перемещений, но я должен сделать следующее, и у меня возникли проблемы. Мне нужно вызвать функцию printf из этого ELF-файла, который я пытаюсь загрузить, и это должна быть та же функция printf, что и из программы, которая пытается загрузить ее. (это моя основная программа, написанная на c ++ из ARM arch). Как я могу получить этот адрес printf, и после этого, как я могу переместить символ в файл elf. (Я гуглил и обнаружил, что этот тип перемещения использует 24-битную относительную адресацию ПК) Может кто-нибудь помочь мне извлечь адрес printf?
Спасибо заранее!

0

Решение

Если вы можете понять C ++, используйте исходный код Люка.

Увидеть: Ассемблеры и Загрузчик, от Дэвид Соломон. [некоторые жемчужины мудрости, некоторые архаичные мелочи]

Как я понимаю, printf находится в том же файле, и вам нужно исправить адрес во время выполнения. В этом случае перемещение является 24-битный ПК относительно перемещение. Ответ: в этом случае вы ничего не делаете. Поскольку исполняемый файл и реализация находятся в одном двоичном файле, 24-битный ПК относительно
уже перемещен независимо от того, какой адрес загрузки.

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

0

Другие решения

Поскольку невозможно понять, где вы находитесь с вашим прогрессом, лучшее предложение было бы указать некоторый исходный код. Проверьте Android линкер под бионический мерзавец.

1

Я нашел решение. Когда я получаю (unsigned int) printf, я получаю фактический 32-битный адрес функции. Патч-код должен быть добавлен в конец текстового раздела в файле ELF. Теперь на месте, где требуется 24-битное смещение, вставляется смещение в код патча. Теперь этот патч-код — это то, что сложно сделать.

редактировать:

Что-то вроде этого:

bl printf должен быть разрешен как bl offset_to_patch_code

Код патча должен быть внизу раздела .text. Следите за тем, чтобы при расчете смещения конвейера выполнялись инструкции PC Point 2. Патч-код должен только сервер считывать в адрес компьютера printf. Вам не нужно сохранять ссылку регистрации.

0
По вопросам рекламы [email protected]