运行时生成机器指令的Hello世界代码?

时间:2013-02-07 15:04:01

标签: c++ c assembly

我坐在Intel MacOSX 10.6上并使用GCC 4.2.1。我试图做的是分配一个缓冲区,用机器指令填充它,然后运行它。全部在一个程序中。

例如,

typedef unsigned char byte_t;

int main(int argc, char** argv) {
    byte_t* code = new byte_t[3];
    code[0] = 0x90; // NOP
    code[1] = 0xC9; // LEAVE - tried also without this.
    code[2] = 0xCB; // RET far - tried also 0xC3, the near return.
    ((void (*)(void)) code)();
    return 0;
}

总线错误消息而失败。我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

不考虑记忆"安全"代码执行,因此操作系统会阻止它。

调查使用mmap()分配内存,并使用PROT_EXEC要求内存可执行。