Windows和Linux上的相同二进制代码(x86)

u14*_*796 2 c++ linker g++

我想将一堆C++文件编译成原始机器代码并使用C语言编写的依赖于平台的启动器运行它.(类似于fread(缓冲区,1,len,文件); a =((*int(*) (int))缓冲区)(b);)

如何告诉g ++输出原始代码?

函数调用会起作用吗?我怎样才能使它工作?

我认为linux和windows的调用约定有所不同.这是一个问题吗?我该如何解决?

编辑:我知道PE和ELF阻止DIRECT启动可执行文件.但这就是我的首发.

Fra*_*kH. 6

有一种(相对)简单的方法可以实现其中的一些,这就是所谓的"与位置无关的代码".请参阅编译器文档.

这意味着您可以将一些源代码编译成二进制文件,无论您在何处放置它,它都将执行.如果你在一个文件和mmap()中有这样一段x86二进制代码(或者是等价的windows),就可以从Linux和Windows调用它.

已经提到的限制当然仍然存在 - 即二进制代码必须限制自己使用在两个平台上都相同的调用约定/可以在两个平台上表示(对于32位x86,它将在堆栈上传递args并返回EAX中的值,当然代码必须完全自包含 - 没有DLL函数调用,因为解析这些是系统相关的,也没有系统调用.

即:

  1. 您需要与位置无关的代码
  2. 您必须创建自包含代码而不需要任何外部依赖项
  3. 您必须从目标文件中提取机器代码.

然后mmap()那个文件,初始化一个函数指针,和(*myblob)(someArgs)可以做.

如果你正在使用gcc,那么"-ffreestanding -nostdinc -fPIC"选项应该为你提供关于前两个的大部分内容,然后使用objdump从ELF目标文件中提取二进制blob.