Мне было интересно во время выполнения поменять константу в скомпилированной функции. После определения относительного адреса константы в теле функции я попытался сделать вот что:
// here we set the constant:
((float *)func)[156] = 0.0;
Компилятор съел, но при попытке запустить сегфолт именно в этой строчке.
Как я понял, нельзя менять код во время выполнения.
Ну ладно, я выделил кусок памяти и скопировал туда содержимое по указателю func, привёл к нужному типу и попытался выполнить.
Снова сегфолт. Наша скопированная функция не хочет выполнятся. И что, получается я не могу выполнить кусок кода, сформированный в рантайме?
Собственно вопрос: Наверное я хочу странного, но как сделать то что я хочу? Это возможно в принципе? А как же работают JIT-компиляторы? А как тогда могут существовать полиморфные вирусы?
Ссылки на статьи/книги/мануалы приветствуются.