一个可执行文件的编译依赖于什么?
What does an executable file compilation depends on?
假设我想为某个平台编译一个 C 程序。我知道我必须在编译中指定 CPU 架构,因为不同 CPU 架构之间的指令集存在差异。我也知道我必须指定目标平台操作系统,因为可执行文件结构和系统调用之间以及...不同操作系统之间的差异。
Q1:问题是如果我也需要指定OS(不是CPU架构)的32位或64位?
换句话说,假设我有两个系统:
- 64 位 CPU + 32 位微软 Windows
- 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.
假设我想为某个平台编译一个 C 程序。我知道我必须在编译中指定 CPU 架构,因为不同 CPU 架构之间的指令集存在差异。我也知道我必须指定目标平台操作系统,因为可执行文件结构和系统调用之间以及...不同操作系统之间的差异。
Q1:问题是如果我也需要指定OS(不是CPU架构)的32位或64位?
换句话说,假设我有两个系统:
- 64 位 CPU + 32 位微软 Windows
- 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.