假设我想为平台编译C程序。我知道我必须在编译中指定CPU体系结构,因为不同CPU体系结构之间的指令集差异。我还知道我必须指定目标平台操作系统,因为可执行文件结构和系统调用之间以及...不同操作系统之间的差异。
Q1:问题是,如果我需要指定OS的32bit或64位(不是CPU架构(?
在另一个单词中,假设我有两个系统:
- 64位CPU 32位Microsoft Windows
- 64位CPU 64位Microsoft Windows
汇编有任何差异吗?
的程序? Q2:当我在gcc
编译器的选项中添加-m32
时,此32
是用什么?是用于操作系统还是用于CPU体系结构?
问题是,如果我需要指定OS的32位或64位(不是CPU体系结构(?
您没有指定操作系统(在给定的计算机上只有一个操作系统;运行其中几个使用操纵虚拟机或一些VM(。您指定&选择一个应用程序二进制界面(ABI(,因为某些 OS可以提供多个ABIS(和运行时系统(。
汇编有任何差异吗?
的程序?
是的,存在一些差异(至少想想sizeof(void*)
;也有64位ISA使用更多的寄存器,ABI可以通过通过寄存器传递更多参数来定义不同的调用约定(。我无法说出有关Windows的更多信息。
当我在GCC编译器的选项中添加-m32时,这32是什么?
深入了解GCC的文档,尤其是调用GCC章节。
这是一些x86选项:
-M32选项将INT,长和指针类型设置为32位,并生成在任何I386系统上运行的代码。
-M64选项将int设置为32位,长指针类型为64位,并为x86-64体系结构生成代码。对于Darwin,仅-M64选项也关闭-fno -pic和-mdynamic -no -no -pic选项。
还阅读有关X32 ABI(这是特定于Linux的东西(。
我不能对特定于Windows(我不知道并且从未使用过(说更多。但是我将解释Linux上的情况。我让您为您的专有Microsoft操作系统寻求类似的知识。
在Linux上,可以(在内核构建时间(配置操作系统内核,以接受32位和64位Elf可执行文件,并为两个架构提供系统调用运行时环境。这样的内核能够使用Execve(2(执行32位可执行文件和64位可执行文件,并为他们提供两个不同的ABI(一个用于686个指令集架构的-m32
,另一个用于-m64
,对于X86-64 ISA(。请注意,相同 OS内核启用在32位或64位模式下执行二进制可执行文件。
我不知道Windows,但是我可以想象Microsoft还提供了两个不同的运行时环境&Abis,一个32位686 ISA,另一个为64位x86-64 ISA。也许其中之一是可选的,需要单独安装或购买(我真的不知道,我不在乎(。
您必须潜入Microsoft文档以找到差异的详细信息。
另请参见x86调用惯例Wikipage。
我建议阅读操作系统之类的内容:三个简单的作品(可自由下载,逐章(,以更多地了解OS的作用,还更多地了解X86-64 ISA,包括其包括其OS的作用长模式。
当然,您需要照顾其他依赖项(或耦合(。阅读有关DLL Hell&依赖地狱。