也许。如果堆是可执行的,您可以分支到该代码。但是一些unix变种使堆空间不可执行,从而使得利用一些安全漏洞如缓冲区溢出变得更加困难(这样即使你可以将代码注入到程序中,你也可能无法分支到它)。(有关 unix 变体及其配置的讨论,请参阅链接文章。)此外,某些处理器体系结构对 code 和 data具有单独的缓存,因此您可能需要发出缓存刷新指令。总而言之,这不是您想要手动完成的事情。
有一个标准的 unix API 来加载和执行代码,它可以使加载的代码可执行:dlopen。必须从文件中加载代码。
即时编译器通常会尝试找到比 dlopen 更快的接口。他们必须管理高度依赖平台的方式来确保代码可执行性。
编辑:感谢Bruce Ediger提醒我需要刷新缓存。