一个可执行文件的编译依赖于什么?

What does an executable file compilation depends on?

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

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

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

  1. 64 位 CPU + 32 位微软 Windows
  2. 64 位 CPU + 64 位微软 Windows

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

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

The question is that if I need to specify the 32bit or 64bit of OS (not of the CPU architecture) too?

您没有指定 Operating System (you have only one OS running on a given machine; to run several of them use an hypervisor or some VM). You specify & choose an Application Binary Interface (ABI) since some OSes are able to offer several ABIs (and runtime systems).

Is there any difference in compilation a program for above systems?

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

When I add -m32 in the options of gcc compiler, what is this 32 for?

深入研究 GCC 的文档,尤其是 Invoking GCC 章节。

有点x86 option:

The -m32 option sets int, long, and pointer types to 32 bits, and generates code that runs on any i386 system.

The -m64 option sets int to 32 bits and long and pointer types to 64 bits, and generates code for the x86-64 architecture. For Darwin only the -m64 option also turns off the -fno-pic and -mdynamic-no-pic options.

另请阅读 x32 ABI(这是 Linux 特定内容)。

我不能多说 Windows 具体(我不知道也从未使用过)。但我会解释 Linux 上发生的事情。我让您去寻找有关您专有的 Microsoft 操作系统的类似知识。

在 Linux 上,操作系统 kernel can be configured (at kernel build time) to accept both 32 bits and 64 bits ELF executables and provide a system call runtime environment for both architectures. Such kernels are able to execute with execve(2) both 32 bits executables, and 64 bits executables and provide two different ABIs (one for -m32 for 686 instruction set architecture, another for -m64 for x86-64 ISA) for them. Notice that the same OS kernel enable executions of binary executables 处于 32 位或 64 位模式。

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

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

另请参阅 x86 calling conventions 维基页面。

我建议阅读类似 Operating Systems : Three Easy Pieces (freely downloadable, chapter by chapter) to understand more the role of an OS, and also more about the x86-64 ISA, including its long mode 的内容。

当然你需要关心其他的依赖(或者coupling). Read about DLL hell & dependency hell.