gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:47:44 25 4
gpt4 key购买 nike

我想将一堆 C++ 文件编译成原始机器代码,然后使用用 C 编写的依赖于平台的启动程序运行它。类似于

fread(buffer, 1, len, file);
a=((*int(*)(int))buffer)(b);

如何让 g++ 输出原始代码?

函数调用会起作用吗?我怎样才能让它发挥作用?

我认为 Linux 和 Windows 的调用约定不同。这是个问题吗?我该如何解决?

编辑:我知道 PE 和 ELF 会阻止可执行文件的直接启动。但这就是我准备开胃菜的目的。

最佳答案

有一种(相对)简单的方法可以实现其中的某些功能,这称为“位置无关代码”。请参阅您的编译器文档。

这意味着您可以将一些源代码编译成二进制文件,无论您将其放置在地址空间的哪个位置,该二进制文件都会执行。如果您在文件中有这样一段 x86 二进制代码和 mmap() 它(或 Windows 等效程序),则可以从 Linux 和 Windows 调用它。

当然,已经提到的限制仍然存在——也就是说,二进制代码必须限制自己使用在两个平台上相同的调用约定/可以在两个平台上表示(对于 32 位 x86,这将在栈和 EAX 中的返回值),当然代码必须是完全独立的——没有 DLL 函数调用,因为解析这些是系统相关的,也没有系统调用。

即:

  1. 你需要位置无关的代码
  2. 您必须创建独立的代码,没有任何外部依赖
  3. 您必须从目标文件中提取机器代码。

然后mmap()那个文件,初始化一个函数指针,(*myblob)(someArgs)可能会做。

如果您使用的是 gcc,-ffreestanding -nostdinc -fPIC 选项应该可以满足您对前两个选项的大部分需求,然后使用 objdump 从 ELF 对象中提取二进制 blob之后归档。

关于c++ - Windows 和 Linux (x86) 上的相同二进制代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com