2013-04-19 5 views
0

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

+1

'& printf' не будет? – syam

+0

Да, я пробовал что-то подобное, но у меня проблемы с переносом на новый код, и я забыл добавить тип переноса: #define R_ARM_CALL 28 (где 28 - значение в фактическом файле) – Dejan

+0

Возможно, файл карты? –

ответ

0

Если вы можете понять C++, используйте источник Luke.

См: Assemblers and Loader, по Дэвид Соломон. [некоторые жемчужины мудрости, некоторые архаичные мелочи]

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

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

+0

Я немного ускорил загрузку * vxWorks *, выполнив то, что я посоветовал. –

+0

Да, он запускается в том же файле, но в том, который я пытаюсь загрузить, существует неразрешенный printf. – Dejan

+0

@ user1338333 Это другая проблема.Вам нужно показать некоторые ** elf ** записи и ассемблер, которые нуждаются в исправлении, поскольку предлагает [auselen] (http://stackoverflow.com/users/1163019/auselen). –

1

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

0

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

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

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

бл Printf должен быть решен как бл offset_to_patch_code

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

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

  • Нет связанных вопросов^_^