Запускать динамически сгенерированную сборку на C (GNU / Linux)

Я пишу пилотный JIT-компилятор на языке C, который в настоящий момент генерирует строки ассемблерного кода. Функциональность встроенной сборки в C работает только со строковыми литералами, которые известны во время компиляции, поэтому я не могу использовать ее для запуска моего сгенерированного во время выполнения кода.

Я читал об использовании mmap () для выполнения сгенерированного машинного кода во время выполнения, но я бы по возможности избегал работы с машинным кодом.

Кто-нибудь знает какие-нибудь решения? Я подумал о том, чтобы записать его в файл и вызвать ассемблер и компоновщик для указанного файла, но это было бы беспорядочно и медленно.


person AlexJ136    schedule 13.08.2013    source источник
comment
Так вы говорите, что генерируете исходный код сборки? Почему бы просто не сгенерировать сам машинный код?   -  person Drew McGowen    schedule 13.08.2013
comment
@DrewMcGowen Я бы предпочел не делать этого, поскольку он менее читабелен, труднее тестировать, а время имеет существенное значение, поэтому, если я хочу, по возможности, избежать рефакторинга. Хотя, похоже, придется.   -  person AlexJ136    schedule 13.08.2013
comment
Существует множество библиотек для создания сборок. gnu-lightning llvm, ...   -  person mathk    schedule 13.08.2013


Ответы (2)


Я думаю, что в конечном итоге для того, чтобы стать «JIT», вам нужно быть чувствительным ко времени, что означает создание машинного кода. Вы можете попробовать ввести некоторый отладочный код, который генерирует как машинный код для запуска, так и код сборки для проверки, запустить ассемблер, сравнить машинный код с языка ассемблера с машинным кодом, который вы сгенерировали напрямую, и использовать его для отладки / проверки машинного кода ( если возможно, иногда ассемблеры хотят делать что-то свое, а не то, что вы от них хотели).

person old_timer    schedule 13.08.2013
comment
Генерация как машинного кода для запуска, так и сборки для отладки / тестирования - отличная идея. Я думаю, что так и сделаю. Большое спасибо. - person AlexJ136; 14.08.2013

Что я сделал, так это сгенерировал код C / C ++ / Fortran, скомпилировал его на лету, связал с DLL и динамически загрузил DLL, и все это занимает не более нескольких секунд. Вы можете сделать то же самое, но сгенерировать ASM. Это очень эффективный метод, когда вам нужна скорость результирующего кода, а также гибкость кода (и библиотек времени выполнения) языка, который вы создаете.

person Mike Dunlavey    schedule 13.08.2013
comment
Я решил выбрать вариант с машинным кодом, но считаю, что это очень интересная идея, я буду рассматривать ее в будущих проектах. Известны ли вам какие-либо соответствующие статьи / руководства и т. Д.? - person AlexJ136; 14.08.2013
comment
@ AlexJ136: Статьи? Ключевые вещи, которые нужно изучить: 1) как написать DLL (подойдет любой пример), 2) как выполнить оболочку для запуска компилятора + компоновщика под управлением вашей программы и 3) как загрузить DLL и получить процедуру обращается к экспорту. - person Mike Dunlavey; 14.08.2013