LINUX.ORG.RU

C++: самодельный язык с JIT.

 


0

1

Есть штук 20-30 написанных в C++ функций. Или методов классов (ну, функция с аргументом this по-сути).

Хочется в рантайме сгенерить кусок машинного кода, который чуть более чем полностью будет представлять собой длинную череду (штук 1000) вызовов этих 20-30 функций и выполнить этот код.

Вопросы:

1) Как можно в принципе передать управление на любые сгенерённые данные? Сегменты кода же защищены обычно от записи, а у сегментов данных нет флажка executable... Так взлетит?

char *code = new char[1024];
// my machine code
memset(code, 123, 1024);
int (*bugaga)(int, int);
// скастить вероломно, ага
bugaga = code;
// вызовем
int result = (*bugaga)(100, 500);

2) Как узнать адреса методов, адреса которых я могу употреблять в своём динамически генеримом машинном коде? Динамический линкинг же всякий там...



Последнее исправление: hlamotron (всего исправлений: 3)

Сегменты кода же защищены обычно от записи, а у сегментов данных нет флажка executable... Так взлетит?

Флаг executable можно назначить явно выделенному куску памяти, а потом передавать на него исполнение

Harald ★★★★★
()

Чтобы просто вызывать уже готовые сишные функции не нужно ничего генерить.

anonymous
()

Как узнать адреса методов, адреса которых я могу употреблять

operator&

в своём динамически генеримом машинном коде?

А соглашение о вызовах тебя не интересуе?

tailgunner ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Вижу дичь и тянет спросить: какова конечная задача? Может задача решается иначе?

Проджект Менеджеры в треде идут в сад.

hlamotron
() автор топика
Ответ на: комментарий от tailgunner

А соглашение о вызовах тебя не интересуе?

Интересуе, но это вроде понятно... Точнее понятно что гуглить.

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Во первых обертки лучше сделай вида extern «C». Во вторых, параметры при этом передаются по указателю в обертку а оттуда разыменуются и куда надо. Так работают сигналы в кутэ и гтк.

В третьих, при этом не надо генерить код. Надо генерить наборы указателей на аргументы и кого вызвать

anonymous
()

Возьми готовую библиотеку. Там и mmap с PROT_EXEC за тебя вызовут, и сохранением регистров озаботятся, и инструкции помогут сгенерировать.

i-rinat ★★★★★
()

Хочется в рантайме сгенерить кусок машинного кода, который чуть более чем полностью будет представлять собой длинную череду (штук 1000) вызовов этих 20-30 функций и выполнить этот код.

Массив указателей на функции чем не подоходит? Или у тебя цель поиграться в низкоуровневое BDSM? man mmap

anonymous
()

А почему бы просто не генерировать синтаксическое дерево после разбора и выполнять его? Аля как калькуляторы на первом курсе учат делать.

В случае вызова n функций подряд это будет стоить как обход связанного списка и немножко дополнительной памяти.

По идее, какой нить boost phoenix может упростить сию задачу, хотя, лично я бы сделал на колене если грамматика не особо сложная.

Хотя на самом деле - лично я бы просто притащил boost.python или luajit в проект.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

А почему бы просто не генерировать синтаксическое дерево после разбора и выполнять его? Аля как калькуляторы на первом курсе учат делать.

Двачую. Если ещё это делать в Java graal (или truffle?), то получим бесплатный JIT для интерпретатора.

anonymous
()

Чё-то вы все не о том говорите. Ему не надо генерировать код, ему надо тупо вызывать уже готовые функции в порядке, определяемым в рантайме. Нафига тут jitы и прочее?

anonymous
()

в топике уже написали шокконтента, какието LLVM/GCC, писать на них JIT займет десятилетия

более чем уверен что автору «чтоб потыкать» хватит байткода генерации и интерпретатора
на примере PHP http://ph7.symisc.net/downloads.html
там PHP интерпретатор без зависимостей в 1 файле, код более чем прост и понятен

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