Я хочу поэкспериментировать с программами, которые пишут программы на C-коде, и я хочу использовать конструкцию, подобную следующей:
int main() {
char* srcCode="int f(int x) { return x+42; }";
int (*compiledFun)(int) = compile(srcCode);
printf("result=%d", (*compiledFun)(123));
return 0;
}
Нужный вывод должен быть напечатан " result = 165 ".
Мой вопрос касается функции compile()
.Я могу попытаться поместить srcCode
в файл, затем вызвать внешний компилятор, например gcc
, затем попытаться прочитать созданный двоичный файл, возможно, исправить некоторые адреса и, таким образом, заполнить память compiledFun
.Но я чувствую, что это было бы очень неэффективно заглушка .Есть ли способ компилировать программу изнутри, прямо из памяти в память?Может быть, какая-то библиотека или подмножество, которые могут быть извлечены из исходных текстов gcc и отвечают за извлечение двоичного кода из исходного текста?
Это может быть важным дополнением, весь исходный код, который должен быть скомпилирован, является функцией, которая принимаетаргументы и возвраты.Он не будет вызывать какие-либо внешние библиотеки и функции, подобные printf
, но только сделает некоторые вычисления и вернет.