试图了解如何在ARM平台中将代码从代码转换为二进制。除了头文件和库文件不同之外,在不同的ARM平台(iOS,Android,Blackberry)中使用的gcc编译器是否相同?还是它们是完全不同的编译器?

评论

iOS过去主要是GCC,如今是LLVM + Clang。

#1 楼

尽管“ GCC编译器”可能是同一软件(通常来说),但是用于此处和此处编译代码的特定实例可能会产生完全不同的输出。可以设置数百个选项,其中许多会影响生成的代码。
即使在构建编译器之后,每个特定的编译器也可能会使用其他选项,例如目标芯片或体系结构级别或特定的优化设置,这些选项将再次更改输出。除了主线,来自GNU的官方GCC之外,还有来自不同组织的各种分支:Linaro GCC,Apple GCC,CodeSourcery GCC,BlackBerry GCC(qcc)等。其中许多具有自定义的优化或其他会影响输出的更改。
甚至主线GCC有时也会从一个版本到另一个版本发生很大变化。
不同平台的接口和可执行格式可能会有所不同,也影响结果。 Android / Linux使用ELF,而iOS具有Mach-O。对于共享库之类的东西,这两个有不同的想法。

#2 楼

在ARM平台上,有几种不同的调用约定。它们根据处理器的功能而有所不同(例如,在具有浮点寄存器(VFP)的处理器上,在其中传递浮点数会更有效,但是会失去与没有VFP的处理器的兼容性)和操作系统。给定的操作系统安装定义了所有程序都必须使用的一种调用约定:标准库使用的调用约定。有时,在给定的系统上可能有多个调用约定。这需要每种调用约定的所有库的副本。

Android NDK附带了一个工具链,其中包括C编译器(GCC的一个版本)。此版本的GCC是针对Android的调用约定设置的。内核有一个单独的工具链(内核不需要使用相同的约定,因为在用户级程序和内核之间没有直接的函数调用)。

iOS有几种不同的调用约定处理器版本。它们在iOS ABI函数调用指南中进行了描述。