1e41f4b71Sopenharmony_ci# OpenHarmony ABI
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciOpenHarmony系统支持丰富的设备形态,支持多种架构指令集,支持多种操作系统内核;为了应用在各种OpenHarmony设备上的兼容性,本文定义了"OHOS" ABI(Application Binary Interface)的基础标准,包含如下方面。
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## 字节序和字宽
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci"OHOS" ABI始终采用little-endian,32位系统采用ILP32,64位系统采用LP64。
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci## 过程调用规范
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ci过程调用规范(Procedure Call Standard)定义了函数调用的参数传递方式,寄存器使用规则,栈操作规则等;不同C++编译器,不同操作系统,不同架构都有可能采用不同的调用规则。详细内容请参考《[不同C++编译器和操作系统的调用规范](https://www.agner.org/optimize/calling_conventions.pdf)》。架构相关的函数调用规范,请参考:
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci- ARM相关的调用规范请参考《[ARM32过程调用标准](https://github.com/ARM-software/abi-aa/tree/main/aapcs32)》。
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci- ARM64相关的调用规范请参考《[ARM64过程调用标准](https://github.com/ARM-software/abi-aa/tree/main/aapcs64)》。
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci## C++ ABI
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ciOpenHarmony系统采用llvm项目中的libc++作为C++运行时库,在系统侧使用libc++.so库来承载,应用侧使用libc++_shared.so来承载,两侧共用一套代码,采用不同的C++命名空间。C++的符号重整规则请参考《[Itanium C++ ABI](https://itanium-cxx-abi.github.io/cxx-abi/)》。
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci
26e41f4b71Sopenharmony_ci## 浮点格式
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci采用IEE754作为浮点编码格式,针对long double的格式定义,将在[支持架构ABI](#支持架构abi)具体说明。
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci## 可执行文件格式
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ciOpenHarmony系统采用ELF文件格式作为全系统的二进制文件格式,具体格式详情,请参考《[System V Application Binary Interface](https://refspecs.linuxfoundation.org/elf/gabi4+/contents.html)》。CPU架构相关的格式定义,参考下面对应架构说明。
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci- arm相关的elf文件格式定义请参考《[arm架构elf文件格式](https://github.com/ARM-software/abi-aa/tree/main/aaelf32)》。
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci- arm64相关elf文件格式定义请参考《[arm64架构elf文件格式](https://github.com/ARM-software/abi-aa/tree/main/aaelf64)》。
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ci## 支持架构ABI
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ci下面介绍下当前“OHOS” ABI中支持的架构以及差异点。
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci
45e41f4b71Sopenharmony_ci### armeabi-v7a
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci此ABI是以《[ARM架构应用二进制接口](https://developer.arm.com/Architectures/ABI)》为基础制定,适用于32位armv7a架构的cpu,支持的核心包括Cortex-A5,Cortex-A7,Cortex-A8,Cortex-A9,Cortex-A12,Cortex-A15,以及Cortex-A17,支持arm32,thumb-2,VFPv3-D16指令。
48e41f4b71Sopenharmony_ci
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci此ABI使用-mfloat-cpu=softfp作为强制浮点数调用规则,本身不影响实际指令是否使用硬件浮点指令。Neon指令等其他扩展在此ABI中是可选的,为了更好的兼容性,建议应用开发者采用-mfpu=softvfp来编译native库 。
51e41f4b71Sopenharmony_ci
52e41f4b71Sopenharmony_ci此ABI使用64位long double(IEEE binary64)。
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci
55e41f4b71Sopenharmony_ci### arm64-v8a
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci此ABI是以《ARM架构应用二进制接口》为基础制定,支持AArch64指令集,默认支持neon特性。
58e41f4b71Sopenharmony_ci
59e41f4b71Sopenharmony_ci此ABI使用-mfloat-cpu=softfp作为强制浮点数调用规则。
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci此ABI使用128位long double(IEEE binary128)。
62e41f4b71Sopenharmony_ci
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci### x86_64
65e41f4b71Sopenharmony_ci
66e41f4b71Sopenharmony_ci此ABI是以Intel64和IA-32 ABI为基础,支持MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1等指令,与x86相关的规范参考《System V Application Binary Interface》、《AMD64 Architecture Processor Supplement》。
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_ci此ABI使用128位long double(IEEE binary128),x86架构上很多平台采用float80格式,OpenHarmony仍然采用128bit形式。
69e41f4b71Sopenharmony_ci
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci## 在编译架构中指定ABI
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci
74e41f4b71Sopenharmony_ci### DevEco Studio中设置
75e41f4b71Sopenharmony_ci
76e41f4b71Sopenharmony_ci在OpenHarmony的C++工程中,找到C++代码所在项目build-profile.json5文件buildOption/externalNativeOptions字段,添加abiFilters字段:
77e41f4b71Sopenharmony_ci
78e41f4b71Sopenharmony_ci```json
79e41f4b71Sopenharmony_ci{
80e41f4b71Sopenharmony_ci    “abiType”: 'stageMode',
81e41f4b71Sopenharmony_ci    “buildOption”: {
82e41f4b71Sopenharmony_ci        “externalNativeOptions”: {
83e41f4b71Sopenharmony_ci            "path": "./src/main/cpp/CMakeLists.txt",
84e41f4b71Sopenharmony_ci            "arguments": "",
85e41f4b71Sopenharmony_ci            "abiFilters": [
86e41f4b71Sopenharmony_ci                "armeabi-v7a",
87e41f4b71Sopenharmony_ci                "arm64-v8a"
88e41f4b71Sopenharmony_ci            ]
89e41f4b71Sopenharmony_ci        }
90e41f4b71Sopenharmony_ci    }
91e41f4b71Sopenharmony_ci}
92e41f4b71Sopenharmony_ci```
93e41f4b71Sopenharmony_ci
94e41f4b71Sopenharmony_ci
95e41f4b71Sopenharmony_ci### cmake中设置
96e41f4b71Sopenharmony_ci
97e41f4b71Sopenharmony_ci通过SDK CAPI开发native代码的时候,在build/cmake/ohos.toolchain.cmake中定义了OpenHarmony系统一些交叉编译常用的环境变量设置。其中OHOS_ARCH变量定义了当前目标编译的ABI,可以设置下面三个ABI中的一种,arm64-v8a,armeabi-v7a,x86_64。
98