返回「计算机、信息技术与工程」

架构和ABI相关知识

架构和ABI相关知识 架构指的是处理器或硬件的设计模型,决定了 CPU 如何处理指令和数据。在开发中,程序需要根据硬件架构进行编译,以生成适配特定硬件的二进制文件。

更多
Markdown 结构化数据
本文目录 9 个章节

架构和ABI相关知识

架构指的是处理器或硬件的设计模型,决定了 CPU 如何处理指令和数据。在开发中,程序需要根据硬件架构进行编译,以生成适配特定硬件的二进制文件。

常见的架构分类:

  • ARM:主要用于移动设备,如 Android 手机。
  • x86:主要用于桌面电脑和服务器。
  • MIPS:曾在嵌入式设备中使用。
  • RISC-V:新兴的开源架构,主要用于研究和开发。

什么是 ABI(Application Binary Interface)?

ABI 是应用程序的二进制接口,定义了编译后的程序如何与操作系统内核、库和其他程序交互。不同的 ABI 可能包括:

  • 函数调用约定(如何传递参数、保存返回值)。
  • 寄存器使用规则
  • 二进制格式(如 ELF 文件格式)。
  • 内存对齐和数据类型布局

assets/image-20241017205502327.png

Android 和 Linux 的 ABI 差异

Android 平台的 ABI

  • Android 使用 ELF 文件格式:与 Linux 系统类似,Android 使用 ELF 格式的二进制文件(如 .so 共享库)。
  • C/C++ 标准库:Android 使用 libc++ 作为 C++ 标准库,并包含了 Android 专用的 Bionic 库。
  • 支持的 ABI
    • armeabi-v7a
    • arm64-v8a
    • x86
    • x86_64

Linux 平台的 ABI

  • GNU 工具链和库:Linux 使用 GNU glibc 作为标准 C 库,支持丰富的系统调用。
  • 更广泛的架构支持:除了 ARM 和 x86,Linux 还支持一些特殊架构(如 MIPS、RISC-V)。
  • 不同的库选项:支持不同的标准库,如 libstdc++musl

Android工具链

1. 工具链:Clang/LLVM

  • Android NDKNDK r18 开始,官方 停止使用 GCC,并完全切换到 Clang/LLVM 编译器工具链。
  • Clang 是 LLVM 项目的一部分,比 GCC 更快、更灵活,并且与 Android 平台有更好的集成。
  • NDK 提供的 clang 及相关工具会支持 C/C++ 标准,并提供对 Android ABI 的优化。

2. C/C++ 标准库:libc++(LLVM 实现)

  • NDK 提供 libc++ 作为默认的 C++ 标准库,它是 LLVM 项目的 C++ 标准库实现。
  • Android NDK 曾支持多个 C++ 标准库(如 GNU 的 libstdc++),但从 NDK r18 开始,libc++ 成为唯一支持的 C++ 标准库。

3. 链接器:lld 和 GNU ld

  • Android NDK 主要使用 LLVM lld 作为默认链接器,具有更快的链接速度和更小的内存占用。
  • NDK 也支持使用 GNU ld.bfd 或 ld.gold 链接器,但不再推荐。

4. 构建系统:CMake 和 Ninja

  • Android NDK 提供了集成 CMakeNinja 的构建支持。
    • CMake 用于生成构建文件。
    • Ninja 是一种高效的构建系统,用于并行构建。