【问题标题】:What does an executable file compilation depends on?可执行文件编译取决于什么?
【发布时间】:2017-11-05 11:53:48
【问题描述】:

假设我想为一个平台编译一个 C 程序。我知道由于不同CPU架构之间指令集的差异,我必须在编译时指定CPU架构。我也知道,由于可执行文件结构和系统调用的差异以及...不同操作系统之间的差异,我必须指定目标平台操作系统。

Q1:问题是如果我也需要指定32bit或64bit的OS(不是CPU架构)?

换句话说,假设我有两个系统:

  1. 64 位 CPU + 32 位微软视窗
  2. 64 位 CPU + 64 位微软视窗

上述系统编译程序有什么不同吗?

Q2:当我在gcc编译器的选项中添加-m32时,这个32是干什么用的?是操作系统还是CPU架构?

【问题讨论】:

  • 它还取决于您链接到的共享库以及编译时头文件定义的系统类型的结构。此外,编译器优化定义了 CPU 提供的最小功能集。 -m 只是目标架构的一个子集,如下所述:gcc.gnu.org/ml/gcc-help/2009-10/msg00280.html - 我会说不要使用它。
  • 为什么说我不用呢?即使我有 32 位 CPU 架构?
  • 是的,不要直接使用,使用 -march=i386 代替。并考虑不进行交叉编译,这样更难获得正确的环境。
  • 您已经接受了答案,所以我认为它有所帮助。
  • 我不是 GCC for Windows 方面的专家,但通常您必须使用为预期目标生成的 GCC。您将使用正确的编译器选择目标。据此,mingw 至少有一个多目标版本:stackoverflow.com/questions/19690504/… 你没有说你使用什么编译器。

标签: gcc compilation operating-system 32bit-64bit cpu-architecture


【解决方案1】:

问题是如果我也需要指定 32 位或 64 位的操作系统(不是 CPU 架构)?

您没有指定Operating System(您只有一个操作系统在给定机器上运行;要运行其中的几个,请使用hypervisor 或一些VM)。您指定并选择 Application Binary Interface (ABI),因为一些操作系统能够提供多个 ABI(和 runtime systems)。

上述系统编译程序有什么不同吗?

是的,有一些区别(至少想想sizeof(void*);同样 64 位 ISA 使用更多的寄存器,ABI 可以定义不同的调用约定,通过寄存器传递更多的参数)。关于Windows,我不能说更多,我不知道。

当我在gcc编译器的选项中添加-m32时,这个32是干什么用的?

深入了解 GCC 的文档,尤其是 Invoking GCC 章节。

是一些x86 option:

-m32 选项将 int、long 和指针类型设置为 32 位,并生成可在任何 i386 系统上运行的代码。

-m64 选项将 int 设置为 32 位,将 long 和指针类型设置为 64 位,并为 x86-64 架构生成代码。对于 Darwin,只有 -m64 选项也会关闭 -fno-pic 和 -mdynamic-no-pic 选项。

另请阅读x32 ABI(这是 Linux 特有的东西)。

我不能说更多关于 Windows 的具体信息(我不知道也从未使用过)。但我将解释 Linux 上发生了什么。我让您为您的专有 Microsoft 操作系统寻求类似的知识。

在 Linux 上,可以将操作系统 kernel 配置为(在内核构建时)接受 32 位和 64 位 ELF 可执行文件,并为这两种架构提供 system call 运行时环境。这样的内核能够使用execve(2) 执行 32 位可执行文件和 64 位可执行文件,并提供两种不同的 ABIs(一个用于 -m32 用于 686 instruction set architecture,另一个用于 -m64 用于 x86-64 ISA)为他们。请注意,相同 OS 内核可以在 32 位或 64 位模式下执行二进制 executables

我不了解 Windows,但我可以想象 Microsoft 还提供两种不同的运行时环境和 ABI,一种用于 32 位 686 ISA,另一种用于 64 位 x86-64 ISA。也许其中一个是可选的,需要单独安装或购买(我真的不知道,我不在乎)。

您可以深入研究 Microsoft 文档以查找差异的详细信息。

另见x86 calling conventionswikipage。

我建议阅读Operating Systems : Three Easy Pieces 之类的内容(可免费下载,逐章阅读)以了解更多操作系统的作用,以及更多关于x86-64 ISA 的信息,包括其long mode

当然,您需要关心其他依赖项(或coupling)。阅读DLL helldependency hell

【讨论】:

  • 所以sizeof(void*) 取决于操作系统而不是取决于 CPU 架构?还是两者都依赖?
  • 取决于 CPU 模式,受 CPU 拱门的限制,由操作系统选择(win64 on x64 可以运行 32 位和 64 位可执行文件)
  • 如果只取决于CPU模式,那么系统1和系统2的编译肯定没有区别。因为两者的CPU相同。我是不是误会了什么?
  • 是的,你误会了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多