LINUX.ORG.RU

Бинарник внутри си


0

0

Родилась идея посдавать задач на всякие олимпиадные автопроверки (вроде acm.timus.ru) на веселых языках.

В связи с этим вопрос:

Положим, у меня есть object-файл гцц (а может быть даже elf-бинарник), и я смог его загнать в некоторую область памяти. В этом коде где-то есть main. Каким образом я могу все это выполнить?


Ответ на: комментарий от anonymous

> прыгнуть на entry point, предварительно создав образ.

А как узнать где entry point? И что такое образ?

pierre
() автор топика

> В этом коде где-то есть main. Каким образом я могу все это выполнить?

Придется написать маленький загрузчик.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Придется написать маленький загрузчик.

А можно какие-нибудь подробности? Может статья есть про такие извращения?

pierre
() автор топика
Ответ на: комментарий от pierre

>> Придется написать маленький загрузчик.

> А можно какие-нибудь подробности?

Нет, давно было :) Я учился по манам солярной libelf и ELF-загрузчикам ядра и glibc.

> Может статья есть про такие извращения?

Ищи по словам ELF runtime linker. Есть фундаментальный труд "Linkers and Loaders", вроде бы свободно доступен виде PDF. http://norfs.sourceforge.net/linkers_and_loaders.pdf

tailgunner ★★★★★
()

Может вам достаточно его просто выполнить? fork() + exec(). Или даже system().

anonymous
()
Ответ на: комментарий от anonymous

System мне нельзя, файлы читать и писать тоже. И форкаться наверное тоже.

pierre
() автор топика

> Родилась идея посдавать задач на всякие олимпиадные автопроверки (вроде acm.timus.ru) на веселых языках.

> В связи с этим вопрос:

> Положим, у меня есть object-файл гцц (а может быть даже elf-бинарник), и я смог его загнать в некоторую область памяти. В этом коде где-то есть main. Каким образом я могу все это выполнить?

зачем это здравому человеку?))

//кстати, видел автора тимуса вввввооооочиииию....он олимпиаду проводил)

//Хрен там бинарник втюкать....

rap-kasta
()

Пиши релоцируемый код (который может быть выполнен, будучи загруженным по любому адресу), тогда не нужно париться с вычислением абсолютных адресов переходов и переменных, выделяй mmap'ом кусок памяти (VM_EXEC не забудь, а то у современных процессоров есть NX-бит), ложи туда код, goto...

mv ★★★★★
()
Ответ на: комментарий от mv

> выделяй mmap'ом кусок памяти (VM_EXEC не забудь, а то у современных 
> процессоров есть NX-бит), ложи туда код, goto...

угу, и все сразу заработает... ;)
париться с вычислением адресов все равно придется (.got, .got.plt, .rela.plt, .rela.dyn), причем много
я уже молчу про TLS...

rei3er
()

> Положим, у меня есть object-файл гцц (а может быть даже elf-бинарник),

А может, слинковать эти объекты в разделяемую библиотеку, и воспользоваться
dlopen?

Dselect ★★★
()
Ответ на: комментарий от Dselect

> и я смог его загнать в некоторую область
согласен с Dselect, для "могу згнать" - используй dlopen
если DLL содержит:

static int qq = some_main_func();

то эта "qq" будет инициализироваться при загрузке DLL
"в некоторую область памяти",
то бишь будет выполняться "some_main_func();"

Valeriy_Onuchin ★★
()

Вы уверены, что это в принципе может работать, с учетом что сервер работает под оффтопиком?

winger
()
Ответ на: комментарий от winger

> Вы уверены, что это в принципе может работать, с учетом что сервер работает под оффтопиком?

метод работает под всеми системами: linix, solaris, mac, win, etc.
использовал лично в проекте, где "состaю":
http://root.cern.ch/
с точностью до того, что dlopen у всех разный


Valeriy_Onuchin ★★
()
Ответ на: комментарий от winger

libtool + libltdl Вам в помощь.

Или можете сами написать свою обертку для LoadLibrary/dlopen/shl_load/etc.

Dselect ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.