试图了解代码如何在 ARM 平台中从代码转换为二进制。不同ARM平台(iOS、Android、Blackberry)使用的gcc编译器是同一个编译器,只是头文件和库文件不同?或者它们是完全不同的编译器?
对于所有 ARM 平台,gcc 编译器的输出是否相同?
逆向工程
手臂
2021-06-18 00:24:01
2个回答
虽然“GCC 编译器”可能是同一个软件(一般来说),但用于编译代码的特定实例可能会产生完全不同的输出。
- 在编译 GCC 本身时,您可以设置数百个选项,其中许多会影响生成的代码。
- 即使在构建编译器之后,每个特定的编译器可能会使用额外的选项,例如目标芯片或架构级别,或特定的优化设置,这将再次更改输出。
- 除了来自 GNU 的官方 GCC 主线,还有来自不同组织的各种 fork:Linaro GCC、Apple GCC、CodeSourcery GCC、BlackBerry GCC (qcc) 等。其中许多具有影响输出的自定义优化或其他更改。
- 甚至主线 GCC 有时也会从一个版本到另一个版本发生相当大的变化。
- 不同平台的接口和可执行格式可能不同,这也会影响结果。Android/Linux 使用 ELF,而 iOS 使用 Mach-O。这两个人对共享库之类的工作方式有不同的看法。
所以,简而言之:不,输出几乎从不相同。
在 ARM 平台上有几种不同的调用约定。它们根据处理器功能(例如,在具有浮点寄存器 (VFP) 的处理器上,在其中传递浮点数更有效,但与没有 VFP 的处理器不兼容)和操作系统的不同而有所不同。
操作系统的给定安装定义了一个所有程序都必须使用的调用约定:标准库使用的调用约定。有时,给定系统上可能有多个调用约定;这需要每个调用约定的所有库的副本。
Android NDK附带一个工具链,其中包括一个 C 编译器(GCC 的一个版本)。此版本的 GCC 是为 Android 的调用约定设置的。内核有一个单独的工具链(内核不需要使用相同的约定,因为用户态程序和内核之间没有直接的函数调用)。
iOS 对于不同的处理器版本有多种调用约定。它们在iOS ABI 函数调用指南 中进行了描述。
其它你可能感兴趣的问题