可执行文件汇编取决于什么



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

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

在另一个单词中,假设我有两个系统:

  1. 64位CPU 32位Microsoft Windows
  2. 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&依赖地狱。

最新更新