0

我可以做类似的事情:

typedef void (*functor)(void* param);

//machine code of function
char functionBody[] = {
    0xff,0x43,0xBC,0xC0,0xDE,....
}
//cast pointer to function
functor myFunc = (functor)functionBody;
//call to functor
myFunc(param);
4

4 回答 4

1

形式上,C 语言不允许函数指针和对象指针之间的转换,所以不能这样做。

然而,许多 C 实现——甚至可能是“大多数”——都支持它作为扩展。它是否有效取决于诸如内存权限和缓存一致性之类的东西,这将根据您的体系结构和操作系统而改变。

于 2010-07-05T10:43:08.100 回答
0

取决于保护环。

data segment在大多数流行的桌面平台上,由于页面权限,您将无法执行代码。

于 2010-07-05T10:13:00.390 回答
0

在现代操作系统上,这取决于内存是否标记为可执行。在 POSIX 系统上,可以使用mmap. 请记住,即使在给定的 cpu 架构上,调用约定也可能会有所不同。例如,如果调用者希望被调用者从堆栈中清除参数,那么您的代码最好这样做,否则它将在返回时崩溃。(通常,C ABI 不会提出这个愚蠢的要求,但这是值得考虑的事情。)

与其尝试将您的机器代码直接作为 C 函数指针调用,不如编写一个调用它的内联 asm 包装器。这样,您就可以控制调用约定。

于 2010-07-05T10:41:12.170 回答
0

它可以工作。可能对机器指令使用 const char[] 会更好,因为在许多平台上,静态 const 存储被放置在只读程序内存部分中。

于 2010-07-05T10:58:59.247 回答