我想,如果我有一个单独函数的原始机器代码输出,我可以满怀恐惧地将其读取到内存块中,只需创建一个指向那里的函数指针,就可以在运行时动态地包含一个函数。
这行得通吗?
是的,它可以工作,但不能以跨平台的方式工作。malloc
返回的内存是不可执行的,至少不能保证它是可执行的。在Windows上,您必须使用VirtualAlloc
,然后使用带有PAGE_EXECUTE_READ
标志的VirtualProtect
。在Linux上,查看mprotect
。基于所使用的编译器和机器体系结构,也可能存在差异,对于Linux+GCC示例,请参阅以下代码golf。
尽管为什么不使用LoadLibrary
+GetProcAddress
(Win(或dlopen
+dlsym
(Linux(动态加载共享库呢?