这是一个奇怪的问题。
假设我有一个在特定平台上运行的C ++代码。此代码的唯一目的是将包含二进制文件NATIVE的文件运行到该平台。
现在 - 我的问题是 - 我如何从运行我的代码的机器的内存中获取这些文件中的数据(甚至可以按位,比如一个周期1024位),以便这些数据在执行部分?
换句话说,我可以将数据传送到可以指向指令指针的地方吗?
如果是,怎么样?
我不介意我是否必须使用汇编程序 - 这样才能正常工作。
编辑:抱歉,我不够具体。
基本上 - 我要加载的文件数据不是像.exe,Mach-O可执行文件或ELF那样的格式。它只是原始二进制数据(我的代码删除了一些自定义标头)。此二进制数据是机器代码,特定于适用于在当前机器上运行的处理器。
从技术上讲,这意味着我想绕过普通的OS执行器并直接加载二进制文件。我可以解释它,但最多只会慢3倍。
如果我需要在另一个子进程中运行数据,我根本不介意 - 但同样,我不能使用正常的进程开启者,因为数据不是操作系统可以自动运行的任何格式(再次 - 如.exe,Mach-O,ELF)。
答案 0 :(得分:4)
您应该只读取文件到内存,将此内存标记为可执行文件(它是特定于平台的,例如Windows的VirtualProtect()
),并将其称为函数:((void(*)())ptr)();
当然,文件中的代码应为position-independent。
答案 1 :(得分:0)
您的解决方案需要具有通用性吗?
OS加载程序通常知道如何处理特定的文件格式以及如何将它们加载到内存中。您通常可以使用OS加载程序并调用入口点,但为此您需要知道入口点是什么,为此您还需要了解文件格式。我无法想到一个可移植的解决方案。
如果你能详细解释你想做什么,也许可以提供解决方案。