C/C++ 程序
作为基础软件广泛使用的编程语言,C/C++ 语言编写的程序在经过编译后, 会生成针对目标平台的二进制可执行文件。这种可执行文件是 与目标平台强相关的, 通常只能在同一种 指令集架构 的硬件平台上才能够执行。
许多 C/C++ 语言编写的程序会访问一些操作系统所提供的、相对底层的 API, 甚至直接与硬件开展交互。一方面,此类程序执行效率得到了提高; 但另一方面,也使这些程序中具备了一些 与硬件架构强相关 的代码。
尽管通过现代编译器提供的“交叉编译”等手段,可以将同样的 C/C++ 代码编译到多种不同目标平台, 但由于 硬件架构强相关 代码的存在,开发者仍然需要针对不同的硬件架构妥善处理, 包括但不限于:
- 为多个硬件架构编写相关代码
- 模拟实现某些目标硬件架构不支持的特性
- 针对不同目标硬件架构指定不同的编译参数
- ...
经过上述处理后,才能完成针对不同平台的编译过程,否则可能产生各种编译失败的情况。
硬件架构强相关的代码模式
C/C++ 程序中,目前已知的有以下 6 种与硬件架构强相关的代码模式。
- 内联汇编:指在 C/C++ 源程序中直接编写的 汇编指令片段
- 宏定义与引用:指在 C/C++ 源程序中引用的由编译器或操作系统提供的 架构相关宏
- 移位运算中的十六进制常数:指在 C/C++ 源程序的移位运算相关操作中使用的 十六进制常数,一般与内存对齐、端序转换有关
- Intrinsics 函数:指在 C/C++ 源程序中引用的、由 编译器内置提供 的架构特有函数
- 多版本函数 (Function Multiversioning): 指在 C++ 程序中借助属性标签
__attribute__
针对不同目标架构 切换函数具体实现 的一种方式 - 系统调用:指在 C/C++ 源程序中使用的由操作系统提供的 系统调用函数,其中一小部分是只有特定架构下才具有的