{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/",
  "atlas": "https://www.pystone.net/?node=cpu-architecture-abi-fundamentals#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals.md",
  "context": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:cpu-architecture-abi-fundamentals",
  "slug": "cpu-architecture-abi-fundamentals",
  "title": "架构和ABI相关知识",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "架构和ABI相关知识 架构指的是处理器或硬件的设计模型，决定了 CPU 如何处理指令和数据。在开发中，程序需要根据硬件架构进行编译，以生成适配特定硬件的二进制文件。",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "0a9253f7e6e3412605d040362abe4f9c724d8d65166e48d8367b197a7cf40e72",
  "assets": [
    {
      "reference": "assets/image-20241017205502327.png",
      "url": "/media/a360b58601ba91377bd3.png",
      "mediaType": "image/png",
      "contentHash": "a360b58601ba91377bd31cb62a05f19ebb9fdb084af54f91ed79ba9fcc5875d9",
      "byteLength": 43592,
      "width": 763,
      "height": 291
    }
  ],
  "headings": [
    {
      "depth": 1,
      "text": "架构和ABI相关知识",
      "anchor": "架构和abi相关知识",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#%E6%9E%B6%E6%9E%84%E5%92%8Cabi%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86"
    },
    {
      "depth": 2,
      "text": "什么是 ABI（Application Binary Interface）？",
      "anchor": "什么是-abiapplication-binary-interface",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#%E4%BB%80%E4%B9%88%E6%98%AF-abiapplication-binary-interface"
    },
    {
      "depth": 2,
      "text": "Android 和 Linux 的 ABI 差异",
      "anchor": "android-和-linux-的-abi-差异",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#android-%E5%92%8C-linux-%E7%9A%84-abi-%E5%B7%AE%E5%BC%82"
    },
    {
      "depth": 2,
      "text": "Android 平台的 ABI",
      "anchor": "android-平台的-abi",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#android-%E5%B9%B3%E5%8F%B0%E7%9A%84-abi"
    },
    {
      "depth": 2,
      "text": "Linux 平台的 ABI",
      "anchor": "linux-平台的-abi",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#linux-%E5%B9%B3%E5%8F%B0%E7%9A%84-abi"
    },
    {
      "depth": 2,
      "text": "Android工具链",
      "anchor": "android工具链",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#android%E5%B7%A5%E5%85%B7%E9%93%BE"
    },
    {
      "depth": 3,
      "text": "1. 工具链：Clang/LLVM",
      "anchor": "1-工具链clangllvm",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#1-%E5%B7%A5%E5%85%B7%E9%93%BEclangllvm"
    },
    {
      "depth": 3,
      "text": "2. C/C++ 标准库：libc++（LLVM 实现）",
      "anchor": "2-cc-标准库libcllvm-实现",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#2-cc-%E6%A0%87%E5%87%86%E5%BA%93libcllvm-%E5%AE%9E%E7%8E%B0"
    },
    {
      "depth": 3,
      "text": "3. 链接器：lld 和 GNU ld",
      "anchor": "3-链接器lld-和-gnu-ld",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#3-%E9%93%BE%E6%8E%A5%E5%99%A8lld-%E5%92%8C-gnu-ld"
    },
    {
      "depth": 3,
      "text": "4. 构建系统：CMake 和 Ninja",
      "anchor": "4-构建系统cmake-和-ninja",
      "citation": "https://www.pystone.net/notes/cpu-architecture-abi-fundamentals/#4-%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9Fcmake-%E5%92%8C-ninja"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:programming-languages-and-runtimes",
      "title": "编程语言与运行时",
      "url": "https://www.pystone.net/notes/programming-languages-and-runtimes/",
      "atlas": "https://www.pystone.net/?node=programming-languages-and-runtimes#knowledge-atlas",
      "label": "编程语言与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "本层中的“架构和ABI相关知识”导航项",
      "citation": "https://www.pystone.net/notes/programming-languages-and-runtimes/#%E6%9C%AC%E5%B1%82"
    }
  ],
  "contentMarkdown": "# 架构和ABI相关知识\n架构指的是处理器或硬件的设计模型，决定了 CPU 如何处理指令和数据。在开发中，程序需要根据硬件架构进行编译，以生成适配特定硬件的二进制文件。\n\n常见的架构分类：\n\n- **ARM**：主要用于移动设备，如 Android 手机。\n- **x86**：主要用于桌面电脑和服务器。\n- **MIPS**：曾在嵌入式设备中使用。\n- **RISC-V**：新兴的开源架构，主要用于研究和开发。\n## **什么是 ABI（Application Binary Interface）？**\n**ABI** 是应用程序的**二进制接口**，定义了编译后的程序如何与操作系统内核、库和其他程序交互。不同的 ABI 可能包括：\n\n- **函数调用约定**（如何传递参数、保存返回值）。\n- **寄存器使用规则**。\n- **二进制格式**（如 ELF 文件格式）。\n- **内存对齐和数据类型布局**。\n\n\n![](assets/image-20241017205502327.png)\n\n## **Android 和 Linux 的 ABI 差异**\n\n## **Android 平台的 ABI**\n\n- **Android 使用 ELF 文件格式**：与 Linux 系统类似，Android 使用 ELF 格式的二进制文件（如 `.so` 共享库）。\n- **C/C++ 标准库**：Android 使用 **libc++** 作为 C++ 标准库，并包含了 Android 专用的 Bionic 库。\n- **支持的 ABI**：\n    - `armeabi-v7a`\n    - `arm64-v8a`\n    - `x86`\n    - `x86_64`\n\n## **Linux 平台的 ABI**\n\n- **GNU 工具链和库**：Linux 使用 **GNU glibc** 作为标准 C 库，支持丰富的系统调用。\n- **更广泛的架构支持**：除了 ARM 和 x86，Linux 还支持一些特殊架构（如 MIPS、RISC-V）。\n- **不同的库选项**：支持不同的标准库，如 **libstdc++** 和 **musl**。\n\n\n## Android工具链\n\n### 1. **工具链：Clang/LLVM**\n\n- **Android NDK** 从 **NDK r18** 开始，官方 **停止使用 GCC**，并完全切换到 **Clang/LLVM** 编译器工具链。\n- Clang 是 **LLVM** 项目的一部分，比 GCC 更快、更灵活，并且与 Android 平台有更好的集成。\n- NDK 提供的 `clang` 及相关工具会支持 **C/C++ 标准**，并提供对 Android ABI 的优化。\n\n\n### 2. **C/C++ 标准库：libc++（LLVM 实现）**\n\n- NDK 提供 **libc++** 作为默认的 C++ 标准库，它是 LLVM 项目的 **C++ 标准库**实现。\n- Android NDK 曾支持多个 C++ 标准库（如 **GNU 的 `libstdc++`**），但从 **NDK r18** 开始，**libc++** 成为唯一支持的 C++ 标准库。\n\n\n### 3. **链接器：lld 和 GNU ld**\n\n- **Android NDK** 主要使用 **LLVM lld** 作为默认链接器，具有更快的链接速度和更小的内存占用。\n- NDK 也支持使用 **GNU ld.bfd 或 ld.gold** 链接器，但不再推荐。\n\n\n### 4. **构建系统：CMake 和 Ninja**\n\n- Android NDK 提供了集成 **CMake** 和 **Ninja** 的构建支持。\n    - **CMake** 用于生成构建文件。\n    - **Ninja** 是一种高效的构建系统，用于并行构建。\n"
}
