1
我測試了一個解釋器調度技術,被稱爲inline threading,我似乎無法轉入可執行內存沒有segfaulting。我使用GCC的labels as values擴展來確定每個操作碼範圍的開始和結束。內聯線程調度與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;
}
編譯和運行用:
gcc test.c -O0 && ./a.out; echo $?
我期待主返回2,而是:
Segmentation fault
139
我用mcc 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