Abr*_*ham 1 gcc operating-system compilation cpu-architecture 32bit-64bit
假设我想为平台编译C程序.我知道我必须在编译中指定CPU架构,因为不同CPU架构之间的指令集不同.我也知道我必须指定目标平台操作系统,因为不同操作系统之间的可执行文件结构和系统调用之间存在差异.
Q1:问题是如果我需要指定32位或64位的OS(不是CPU架构)?
换句话说,假设我有两个系统:
编译上述系统的程序有什么不同吗?
Q2:当我添加编译器-m32的选项时gcc,这是32为了什么?它是用于操作系统还是用于CPU架构?
问题是,如果我需要指定32位或64位的OS(不是CPU架构)?
您没有指定操作系统(您在给定计算机上只运行一个操作系统;要运行其中几个操作系统,请使用虚拟机管理程序或某些虚拟机).您指定并选择应用程序二进制接口(ABI),因为某些操作系统能够提供多个ABI(和运行时系统).
编译上述系统的程序有什么不同吗?
是的,有一些区别(sizeof(void*)至少可以想到; 64位ISA使用更多的寄存器,ABI可以定义不同的调用约定,通过寄存器传递更多的参数).我不知道有关Windows的更多信息,我不知道.
当我在gcc编译器的选项中添加-m32时,这32是什么用的?
深入了解GCC的文档,特别是Invoking GCC章节.
这是一些x86选项:
-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上,可以配置操作系统内核(在内核构建时)以接受32位和64位ELF可执行文件,并为两种体系结构提供系统调用运行时环境.这样的内核能够用execve(2)执行32位可执行文件和64位可执行文件,并为它们提供两个不同的ABI(一个-m32用于686 指令集架构,另一个-m64用于x86-64 ISA).请注意,相同的 OS内核允许以32位或64位模式执行二进制可执行文件.
我不知道Windows,但我可以想象微软还提供两种不同的运行时环境和ABI,一种用于32位686 ISA,另一种用于64位x86-64 ISA.也许其中一个是可选的,需要单独安装或购买(我真的不知道,我也不在乎).
您可以深入了解Microsoft文档以查找差异的详细信息.
另请参见x86调用约定 wikipage.
我建议阅读类似操作系统:三个简单的部分(可自由下载,逐章),以了解更多操作系统的作用,以及更多关于x86-64 ISA,包括其长模式.
当然,你需要关心其他依赖(或耦合).阅读DLL地狱和依赖地狱.