我可以做类似的事情:
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);
我可以做类似的事情:
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);
形式上,C 语言不允许函数指针和对象指针之间的转换,所以不能这样做。
然而,许多 C 实现——甚至可能是“大多数”——都支持它作为扩展。它是否有效取决于诸如内存权限和缓存一致性之类的东西,这将根据您的体系结构和操作系统而改变。
取决于保护环。
data segment
在大多数流行的桌面平台上,由于页面权限,您将无法执行代码。
在现代操作系统上,这取决于内存是否标记为可执行。在 POSIX 系统上,可以使用mmap
. 请记住,即使在给定的 cpu 架构上,调用约定也可能会有所不同。例如,如果调用者希望被调用者从堆栈中清除参数,那么您的代码最好这样做,否则它将在返回时崩溃。(通常,C ABI 不会提出这个愚蠢的要求,但这是值得考虑的事情。)
与其尝试将您的机器代码直接作为 C 函数指针调用,不如编写一个调用它的内联 asm 包装器。这样,您就可以控制调用约定。
它可以工作。可能对机器指令使用 const char[] 会更好,因为在许多平台上,静态 const 存储被放置在只读程序内存部分中。