У меня есть выбор, чтобы сделать загрузчик для ARM-эльфов перемещаемых файлов. Мне удалось каким-то образом разобрать эльфа, и мне удалось сделать несколько простых перемещений, но я должен сделать следующее, и у меня проблемы. Мне нужно вызвать функцию printf из этого файла ELF, который я пытаюсь загрузить, и должна быть той же функцией printf, что и программа, которая пытается ее загрузить. (это моя хост-программа, написанная в C++ из арки ARM). Как я могу получить этот адрес printf, и после этого, как я могу переместить символ в файл elf. (Я googled и узнал, что этот тип переезда использует 24-битную относительную адресацию ПК) Может ли кто-нибудь помочь мне извлечь адрес printf? Thanx заранее!Как получить адрес функции printf в руке исполняемый
ответ
Если вы можете понять C++, используйте источник Luke.
См: Assemblers and Loader, по Дэвид Соломон. [некоторые жемчужины мудрости, некоторые архаичные мелочи]
Как я понимаю, printf
находится в том же файле, и вам нужно исправить адрес во время выполнения. В этом случае перемещение - это 24-разрядный ПК, относительный перенос. Ответ в том, что вы ничего не делаете в этом случае. Поскольку исполняемый файл и реализация находятся в одном бинарнике, 24-разрядный компьютер уже перемещен независимо от того, какой адрес загрузки является.
Если вы передислоцировали общую библиотеку, процесс был бы иным.
Я немного ускорил загрузку * vxWorks *, выполнив то, что я посоветовал. –
Да, он запускается в том же файле, но в том, который я пытаюсь загрузить, существует неразрешенный printf. – Dejan
@ user1338333 Это другая проблема.Вам нужно показать некоторые ** elf ** записи и ассемблер, которые нуждаются в исправлении, поскольку предлагает [auselen] (http://stackoverflow.com/users/1163019/auselen). –
Я нашел решение. Когда я получаю (unsigned int) printf, я получаю фактический 32-разрядный адрес функции. Код исправления должен быть добавлен в конец текстового раздела в файле ELF. Теперь на месте, где требуется 24-битное смещение, вставлено смещение в код исправления. Теперь этот код исправления - это то, что трудно сделать.
редактировать:
Что-то вроде этого:
бл Printf должен быть решен как бл offset_to_patch_code
код патч должен быть на нижней секции .text. Следите за тем, чтобы подсчитать смещенный трубопровод, сделанный командой pc point 2 вперед. Патч-код должен только сервер считывать в адрес pc printf. Вам не нужно сохранять реестр ссылок.
'& printf' не будет? – syam
Да, я пробовал что-то подобное, но у меня проблемы с переносом на новый код, и я забыл добавить тип переноса: #define R_ARM_CALL 28 (где 28 - значение в фактическом файле) – Dejan
Возможно, файл карты? –