GCC 您所在的位置:网站首页 兼容性概念 GCC

GCC

2024-06-18 21:23| 来源: 网络整理| 查看: 265

下一篇: gcov—a Test Coverage Program ,上一篇: GNU Objective-C Features ,上一篇: Introduction [ Contents ][ Index ]

9 二进制兼容性 ¶

二进制兼容性包含几个相关概念:

应用程序二进制接口 (ABI)

处理程序二进制表示的所有工具遵循的运行时约定集,包括编译器、汇编器、链接器和语言运行时支持。一些 ABI 是正式的,带有书面规范,可能由多个相关方设计。其他的只是一组特定工具实际完成事情的方式。

ABI conformance

如果编译器生成的代码遵循 ABI 枚举的所有规范,则编译器符合 ABI。如果 library 根据 ABI 实现,则它符合 ABI。如果应用程序是使用符合 ABI 的工具构建的,并且不包含专门更改 ABI 指定的行为的源代码,则该应用程序符合 ABI。

calling conventions

调用约定是 ABI 的子集,它指定如何传递参数和返回函数结果。

interoperability

如果不同的工具集生成可在同一程序中使用的文件,则它们是可以互操作的。该工具集包括编译器、汇编器、链接器、库、头文件、启动文件和调试器。由不同工具集生成的二进制文件不能互操作,除非它们实现相同的 ABI。这适用于同一工具的不同版本以及来自不同供应商的工具。

intercallability

由一组工具构建的二进制文件中的函数是否可以调用由另一组工具构建的二进制文件中的函数是互操作性的一个子集。

implementation-defined features

语言标准包括实现定义的功能列表,其行为可能因一种实现而异。其中一些功能通常包含在平台的 ABI 中,而其他功能则不然。ABI 未涵盖的功能通常会影响程序的行为方式,但不会影响互调用性。

compatibility

遵守相同的 ABI 和实现定义的功能的相同行为都与兼容性相关。

C 或 C++ 编译器实现的应用程序二进制接口会影响代码生成和运行时支持:

数据类型的大小和对齐方式 结构化类型的布局 calling conventions 寄存器使用约定 运行时算术支持的接口 目标文件格式

此外,C++ 编译器实现的应用程序二进制接口会影响代码生成和运行时支持:

name mangling exception handling 调用构造函数和析构函数 类的布局、对齐和填充 虚拟表的布局和对齐

某些 GCC 编译选项会导致编译器生成不符合平台默认 ABI 的代码。对于 ABI 未涵盖的实现定义的功能,其他选项会导致不同的程序行为。提供这些选项是为了与其他不遵循平台默认 ABI 或平台实现定义功能的通常行为的编译器保持一致。使用此类选项时要非常小心。

大多数平台都有一个涵盖 C 代码的明确定义的 ABI,但涵盖 C++ 功能的 ABI 尚不常见。

从 GCC 3.2 开始, GCC C++ 二进制约定基于书面的、供应商中立的 C++ ABI,该 ABI 专门针对 64 位 Itanium 而设计,但也包括适用于任何平台的通用规范。其他编译器供应商也在某些平台上实现了此 C++ ABI,特别是 GNU/Linux 和 BSD 系统。我们已努力提供与未来 GCC 版本兼容的稳定 ABI,但我们可能会遇到使这变得困难的问题。此类问题可能包括不同供应商对 C++ ABI 的不同解释、ABI 中的错误或不同编译器中 ABI 实现中的错误。 GCC 的-Wabi当 G++ 生成可能与 C++ ABI 不兼容的代码时,switch 会发出警告。

与 C++ 编译器一起使用的 C++ library 包括标准 C++ 库,具有 C++ 标准中定义的功能以及语言运行时支持。运行时支持包含在 C++ ABI 中,但标准 C++ 库没有正式的 ABI。如果一个 library 的两个实现遵循另一个的实际 ABI,并且它们都使用相同的编译器构建,或者使用符合 C++ 编译器和运行时支持的相同 ABI 的编译器构建,则它们是可互操作的。

当 G++ 和另一个 C++ 编译器符合相同的 C++ ABI,但它们通常使用的标准 C++ Library 的实现不遵循标准 C++ Library 的相同 ABI 时,使用这些编译器构建的目标文件可以在同一程序中使用仅当他们使用相同的 C++ library 时。这需要在调用未使用常用 library 的编译器时指定 C++ library 头文件的位置。 GCC 的 C++ 头文件的位置取决于 GCC 构建的配置方式,但可以通过使用 G++ 查看-v选项。使用 G++ 3.3 的默认配置选项,不同 C++ 编译器的编译行需要包含

-Igcc_install_directory/include/c++/3.3

同样,使用必须使用 GNU C++ library 之外的 C++ library 的 G++ 编译代码需要指定其他 library 的头文件的位置。

链接程序以使用特定 C++ library 的最直接方法是使用默认指定 C++ library 的 C++ 驱动程序。例如, g++ 驱动程序告诉链接器在哪里可以找到 GCC 的 C++ library (libstdc++)加上它需要的其他 libraries 和启动文件(按正确的顺序)。

如果程序必须使用不同的 C++ library 并且无法使用默认使用该 library 的 C++ 驱动程序进行最终链接,则有必要告诉 g++ 该 library 的位置和名称。可能还需要指定不同的启动文件和其他运行时支持 libraries ,并通过一个或多个选项禁止使用 GCC 支持 libraries-nostdlib,-nostartfiles, and-nodefaultlibs.

下一篇: gcov—a Test Coverage Program ,上一篇: GNU Objective-C Features ,上一篇: Introduction [ Contents ][ Index ]

© Free Software FoundationLicensed under the GNU Free Documentation License, Version 1.3. https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc/Compatibility.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有