---
title: "架构和ABI相关知识"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/架构和ABI相关知识.md"
content_hash: 0a9253f7e6e3412605d040362abe4f9c724d8d65166e48d8367b197a7cf40e72
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 架构和ABI相关知识
架构指的是处理器或硬件的设计模型，决定了 CPU 如何处理指令和数据。在开发中，程序需要根据硬件架构进行编译，以生成适配特定硬件的二进制文件。

常见的架构分类：

- **ARM**：主要用于移动设备，如 Android 手机。
- **x86**：主要用于桌面电脑和服务器。
- **MIPS**：曾在嵌入式设备中使用。
- **RISC-V**：新兴的开源架构，主要用于研究和开发。
## **什么是 ABI（Application Binary Interface）？**
**ABI** 是应用程序的**二进制接口**，定义了编译后的程序如何与操作系统内核、库和其他程序交互。不同的 ABI 可能包括：

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


![assets/image-20241017205502327.png](/media/a360b58601ba91377bd3.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 NDK** 从 **NDK 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 提供了集成 **CMake** 和 **Ninja** 的构建支持。
    - **CMake** 用于生成构建文件。
    - **Ninja** 是一种高效的构建系统，用于并行构建。
