x86 可执行文件 运行 可以在任何 x86 平台上提供正确的 运行 时间库吗?

Can an x86 executable run on any x86 platform given the right runtime libraries?

虽然我确实找到了类似的问题,但他们并没有真正回答这个具体问题。

编译后的 x86 可执行文件 运行 可以在任何 x86 平台上提供正确的 运行 时间库吗? 假设我制作了一个没有依赖项的 C++17 程序 ,我可以 运行 这个程序 Windows 95 或者 [= 需要某种支持吗? 25=]?

我还听说 RTTI(在 C++ 的情况下)可能并非在任何地方都受支持,这仅仅是因为处理器必须支持此功能还是 OS 在其中发挥了作用?这意味着新功能可能不受支持,例如 Windows 95.

编辑

我想要的是可执行文件(例如 x86)是否可以 运行 在任何支持该指令集的平台上,或者某些功能,如 RTTI,是否需要特定的 OS 支持,因此并非在支持该指令集的所有平台上都可用。

这个问题没有抓住重点。 C++ 首先是一种描述计算机程序行为的语言。

使用编译器创建本机二进制可执行文件以产生在实际计算机上的行为是使用该语言的典型方式。

一旦您拥有二进制文件,用于生成它的源代码的所有痕迹都将消失(除非您为调试目的构建了一个特殊版本)。二进制文件与特定硬件或操作系统的兼容性超出了C++本身的范围。

对于 C 或通常编译为本机二进制代码的任何其他编程语言也是如此。

或者,更简短地回答问题:

Can compiled C++/C code (i.e. an executable) run anywhere given the right runtime libraries?

没有

Can a compiled x86 executable run anywhere given the right runtime libraries?

不,它只能在 x86 硬件或模拟 x86 指令集(例如 x64 CPU)的其他硬件(或软件,例如虚拟机)上运行。实际上,这很可能与 "anywhere."

相去甚远

即使硬件匹配,x86 可执行文件也会有操作系统依赖性。 Windows 二进制文件不会在 Linux 上 运行,即使硬件相同。在某些情况下,有多种策略可以使 "work" 这样的事情,Microsoft 的 Linux Subsystem for Windows 是最近的一个示例,它允许 Linux 二进制文件 运行 在 Windows 上保持不变.再次,"anywhere."

的鱼苗叫声

一般来说,你不能,即使你将你的宇宙限制在 x86 硬件上——至少在没有二进制或某些平台特定的转换的情况下是这样 "loader"每个目标平台。

例如,C 或 C++ 编译器发出的典型二进制文件1 将对 OS 和 运行 时间有一些最小的依赖性,例如加载并在可执行文件上执行 运行time 链接。不同的平台有不同的二进制格式(例如 PE/COFF on Windows or ELF 跨各种 UNIX 风格和 Linux)并且没有任何通用的 "x86 format" 可以直接 在任何平台上。

此外,任何非平凡的程序,在许多情况下 任何 程序,无论是否平凡,都会对语言具有特定于平台的依赖性 运行时间。例如,即使是一个空的 main() 函数通常也需要 运行 时间支持才能从 OS 定义的 "start" 方法到 main 方法,并且没有不寻常的构建选项经常在启动时调用以初始化部分标准库。

最后,正如您在有关 RTTI 的评论中提到的,各种语言或平台功能本质上可能会编译到二进制文件中并需要 OS 支持。 RTTI 可能 显然 不属于这一类,但位置无关代码、线程本地存储和异常处理的堆栈展开支持等通常属于此类。使用此类功能的已编译 x86 代码在不同平台上可能完全不同,因为它需要构建这些功能的假设。

但是,原则上,您可以想象 这有效,至少对于某些有限的程序子集。例如,虽然各种可执行文件格式实际上不兼容,但它们 不同,tools exist 无法在它们之间转换。所以你当然可以在你感兴趣的平台上实现一个最小的 运行time,它将 x86 可执行文件编译成你选择的任何固定格式,并在 运行time 转换为本地格式和 运行s它。

除此之外,由于不同的操作系统使用不同的 calling conventions,因此实际上尝试映射标准库调用将非常困难,但 "C" 函数使用一些 thunk 将内容放入正确的地方。 C++ 几乎是正确的,因为那里的 ABI 更复杂,特定于编译器和平台,并且许多实现细节已经编译在头文件中实现的东西。

事实上,x86(的一个子集)可能为跨平台执行提供一种有趣的中间语言的想法正是 Google 的 [NaCl 项目] 所利用的想法。从本质上讲,NaCl 运行time 提供了与平台无关的 "loading" 功能,允许 x86 代码在各种平台上或多或少地原生 运行。随后添加了其他原生格式,例如 ARM,但它最初是作为 x86 沙箱开始的。该项目的很大一部分涉及 运行 可证明安全的代码(即沙盒)——但它表明,使用某些基础架构,您可以编写 "portable" x86。然而,标准的 C 或 C++ 编译器不会直接生成 NaCl 兼容代码。


1 真的,任何 编译为本机格式的编译器。我只提到 C 和 C++,因为它们看起来像您感兴趣并且广为人知的那些。