FAQ

影响 ABI 兼容性的有哪些因素

Note

ABI(Application Binary Interface)兼容性受多个因素影响,这些因素决定了二进制文件能否正确链接和运行:

编译器相关因素

编译器类型和版本

  • GCC 4.x → 5.x 的 ABI 断裂(std::string 实现改变)
  • MSVC 不同版本间的 C++ ABI 差异
  • Clang 与 GCC 的微妙差异

C++ 标准库实现

  • libstdc++ vs libc++
  • 不同版本的标准库接口变化

数据布局因素

结构体内存布局

struct Example {
   char a;     // 1 字节
   int b;      // 4 字节,可能有 3 字节对齐填充
   double c;   // 8 字节,可能需要 8 字节对齐
};
// 总大小和成员偏移量依赖编译器设置

对齐和打包

  • #pragma pack 设置
  • 编译器默认对齐策略
  • 平台相关的对齐要求

函数调用约定

调用约定差异

  • Windows: __stdcall, __cdecl, __fastcall
  • 参数传递顺序(左到右 vs 右到左)
  • 栈清理责任(调用者 vs 被调用者)
  • 寄存器使用约定

C++ 特有因素

名称修饰(Name Mangling)

void func(int, char*);
// GCC: _Z4funcIPc
// MSVC: ?func@@YAXHPAD@Z

虚函数表布局

  • vtable 指针位置
  • 虚函数排序
  • 多重继承的 vtable 布局

异常处理

  • 不同的异常处理模型
  • 栈展开机制差异

平台和架构因素

目标架构

  • x86 vs x64 指针大小
  • ARM vs x86 字节序
  • 寄存器数量和约定

操作系统

  • Linux ELF vs Windows PE
  • 动态链接机制差异
  • 系统调用接口

编译选项

优化级别

  • 内联函数展开
  • 死代码消除可能影响符号导出

运行时库

  • 静态链接 vs 动态链接
  • Debug vs Release 运行时