Я тестирую методику отправки интерпретатора, называемую inline threading, и я не могу попасть в исполняемую память без segfault. Я использую расширение GCC labels as values для определения начала и конца каждого интервала кода операции.Inline threaded dispatch with memcpy
test.c:
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
int main (int argc, char** argv) {
int i = 0;
if (argc > 0x10) {
// prevent optimization
inc_start: i++; inc_end:;
ret_start: goto end; ret_end:;
}
void* m = mmap(
0,
getpagesize(),
PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE,
-1,
0);
if (!m) {
return -1;
}
{
char* x = m;
memcpy(x, &&inc_start, &&inc_end - &&inc_start); x += &&inc_end - &&inc_start;
memcpy(x, &&inc_start, &&inc_end - &&inc_start); x += &&inc_end - &&inc_start;
memcpy(x, &&ret_start, &&ret_end - &&ret_start); x += &&ret_end - &&ret_start;
}
goto *m;
end:
return i;
}
Compile и работать с:
gcc test.c -O0 && ./a.out; echo $?
Я ожидаю главный вернуться 2, но вместо этого:
Segmentation fault
139
I компиляция с gcc 4.7.2 на 64-битная Linux-машина, и я уверен, что ничто не оптимизируется. Любые советы о том, как это сделать?
Код Youir не является стандартным C и вызывает неопределенное поведение. Какой у Вас вопрос? – Olaf
Вы ссылались на ярлыки как на ссылку значений? Да, это не стандарт, но расширение поддерживается большинством компиляторов C. Как автор этой статьи получил встроенную поточную диспетчерскую работу? http://www.sable.mcgill.ca/publications/papers/2003-2/sable-paper-2003-2.pdf См. рисунок 2. – ytrp
Я не буду, потому что это неправильный подход и не допускается веские причины. Я не здесь, чтобы учиться, просто сказал вам. (И нет, это не поддерживается ** большинством ** компиляторов! Есть больше, чем gcc, msvc и clang/llvm. – Olaf