LINUX.ORG.RU

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


0

0

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

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

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


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

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

anonymous ()
Ответ на: Re: Бинарник внутри си от anonymous

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

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

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

pierre ()

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

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

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

tailgunner ★★★★★ ()
Ответ на: Re: Бинарник внутри си от pierre

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

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

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

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

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

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

tailgunner ★★★★★ ()

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

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

anonymous ()
Ответ на: Re: Бинарник внутри си от anonymous

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

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

pierre ()

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

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

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

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

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

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

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

rap-kasta ()

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

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

mv ★★★★★ ()
Ответ на: Re: Бинарник внутри си от mv

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

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

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

rei3er ()

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

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

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

Dselect ★★★ ()
Ответ на: Re: Бинарник внутри си от Dselect

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

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

static int qq = some_main_func();

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

Valeriy_Onuchin ★★ ()

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

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

winger ()
Ответ на: Re: Бинарник внутри си от winger

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

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

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


Valeriy_Onuchin ★★ ()
Ответ на: Re: Бинарник внутри си от winger

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

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

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

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