Я немного понимаю, как «int a = b + abs (c)» можно перевести в простые инструкции по сборке, а затем перевести это в некоторый двоичный двоичный объект.Но как это можно запустить и динамически взаимодействовать в памяти?
- edit -
Я знаю, что C не имеет функции eval.Но то, к чему это компилируется, делает.Я имею в виду, что именно это делает Java подобным JIT, и в этом отношении вредоносное ПО для внедрения кода возможно?Например, функция abs () - это просто указатель, который можно вызывать по протоколу cdecl.Новые функции должны быть доступны через прохождение указателей на функции cdecl.Что я не понимаю, так это то, как этот новый код может быть введен во время выполнения.
Я спрашиваю это скорее как давний академический интерес, чем наиболее эффективно решить актуальную проблему.
- пример -
Скажем, у меня есть фрагмент встроенного кода Python, который часто вызывается из нативной программы и который также вызывает нативную привязку notify ():
def add(a, b):
notify()
return a+b
Для того, чтобы это было делом, функция, вероятно, должна содержать немного больше кода (и гораздо более полезного), но потерпите меня.Профилировщик (или подсказки из c-bindings) также определил, что все вызовы с целыми числами как со всеми параметрами, так и с возвращаемым значением.Это соответствует:
int add(int a, int b) {
notify();
return a + b;
}
Что может быть скомпилировано в x86 cdecl примерно так:
:_add
push ebp ;setting up scope
mov ebp, esp
call _notify ;or more likely by a pointer reference
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret
Затем, наконец, собрана в двоичную строку.Конечно, для каждой платформы нужно было бы реализовать базовый компилятор.Но в стороне от этой проблемы, скажем, теперь у меня есть указатель на этот действительный двоичный код x86.Можно ли каким-то образом извлечь из этого указатель на функцию cdecl, пригодную для родной программы?
Извините за неясное намерение по поводу моего вопроса