由链接编辑器和运行时链接程序处理的 ELF 目标文件提供了许多其他目标文件可以绑定到的全局符号。这些符号描述了目标文件的应用程序二进制接口 (Application Binary Interface, ABI)。在目标文件演变过程中,此接口可能会由于添加或删除全局符号而发生更改。此外,目标文件演变还可能涉及内部实现更改。
版本控制是一些可以应用于某个目标文件以指示接口与实现更改的技术。这些技术使目标文件的演变过程受到控制,同时又维护向下兼容性。
本章介绍了如何定义目标文件的 ABI,此外,还介绍了对此 ABI 接口的更改影响下兼容性的方式。我们将借助模型来探讨这些概念,说明如何将接口和实现的更改纳入目标文件的新发行版。
本章重点介绍动态可执行文件与共享目标文件的运行时接口。对说明和管理这些动态目标文件内更改的方法只作一般性介绍。附录 B中提供了适用于共享目标文件的一组通用命名约定和版本控制方案。
动态目标文件的开发者必须注意接口更改的结果,并了解管理此类更改的方法,尤其是关于维护与以前所发布的目标文件的向下兼容性。
由任何动态目标文件实现可用的全局符号都代表目标文件的公共接口。通常,进行链接编辑之后留在目标文件中的全局符号数多于希望公开的符号数。这些全局符号源于用于创建目标文件的可重定位目标文件之间所需的符号状态。这些符号代表目标文件内部的专用接口。
要定义目标文件的 ABI,应当首先确定目标文件中那些希望使其公开可用的全局符号。可以在最终的链接编辑过程中使用链接编辑器的 -M 选项和关联的 mapfile 来建立这些公共符号。缩减符号作用域中介绍了此技术。此公共接口可在正在创建的目标文件内建立一个或多个版本定义。这些定义构成目标文件演变时添加新接口的基础。
以下各节基于此初始公共接口。不过,首先应了解如何对接口的各种更改进行分类,以便对这些接口进行适当管理。