Выполнение машинных кодов, прикрепленных в конце исполняемого файла
У меня есть объектный файл, который имеет функцию main() внутри и просто должен быть связан с crt... объектами, чтобы быть исполняемым. К сожалению, я могу только скомпилировать и не могу связать его как исполняемый файл.
поэтому я решил создать программу переменного тока (на ПК с работающим GCC и компоновщиком), чтобы прикрепить объект (ы) в конце самого себя и выполнить коды, присоединенные во время выполнения (имитирующие связанный объект).
Я видел DL API, но я не знаю, как использовать его для указанной проблемы.
Может быть, sb поможет мне узнать, как я могу выполнить код, прикрепленный в конце исполняемого файла.
1 ответ
Избегайте этого; это будет беспорядок.... И это, вероятно, не будет надежно работать, по крайней мере, если программа динамически связана с libc6.so
(например, из-за ASLR)
Просто используйте общие объекты и динамически связанные библиотеки (см. Вики-страницу динамического компоновщика). Вы должны узнать о dlopen(3) и т. Д.
Если вы действительно настаиваете, потратьте много недель, чтобы узнать больше: прочитайте книгу Левина о компоновщике и загрузчиках, прочитайте http://advancedlinuxprogramming.com/, прочитайте много man-страниц (включая execve (2), mmap (2), elf (5), ld). так (8),...) изучите код ядра для execve
а также mmap
исходные коды GNU libc и MUSL libc (для получения подробной информации о реализации динамического компоновщика), ABI x86-64 или ABI для вашего целевого процессора (это ARM?), узнайте больше о GNU binutils и т. д., и т. д., и т.п.
Короче говоря, ваша жизнь слишком коротка, чтобы заниматься такими грязными делами, если только вы не являетесь экспертом, например, не в состоянии реализовать свой собственный динамический компоновщик.
добавлений
Видимо, ваша настоящая проблема, кажется, использует tinycc на ARM (под Android, я думаю). Затем я бы попросил их список рассылки (возможно, внесу свой вклад с каким-нибудь патчем) или просто использовал binutils и создал свой собственный скрипт компоновщика GNU ld, чтобы он работал. Тогда вопрос становится совершенно другим и совершенно не связанным с вашим первоначальным вопросом. Согласно поисковым запросам Google, могут быть некоторые предыдущие попытки решить эту проблему.