Выполнение машинных кодов, прикрепленных в конце исполняемого файла

У меня есть объектный файл, который имеет функцию 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, могут быть некоторые предыдущие попытки решить эту проблему.

Другие вопросы по тегам