编程接口指南

定义 Solaris ABI

Solaris ABI 是在 Solaris 库中定义的。这些定义是通过链接编辑器和运行时链接程序中使用的库版本控制技术和策略完成的。

Solaris 库中的符号版本控制

Solaris 链接编辑器和运行时链接程序使用两种库版本控制:文件版本控制和符号版本控制。在文件版本控制中,库名称后面会附带版本号,如 libc.so.1。对该库中的一个或多个公共接口进行不兼容的更改之后,版本号将递增(如递增到 libc.so.2)。在动态链接的应用程序中,生成时绑定的符号在运行时可能不会出现在库中。在符号版本控制中,Solaris 链接程序将符号集与名称关联。然后在运行时链接过程中,链接程序将检查库中是否存在此名称,以验证是否存在关联的符号。

库符号版本控制将符号集与符号版本名称关联,如果此名称具有编号方案,则还会通过映射文件将符号集与其编号关联。以下是假设的 Sun 库 libfoo.so.1 的映射文件示例。

        SUNW_1.2 {

            global:

                symbolD;

                symbolE

        } SUNW_1.1;



        SUNW_1.1 {

            global:

                symbolA;

                symbolB;

                symbolC;

        };



        SUNWprivate {

            global:

                __fooimpl;

            local: *;

        };

此映射文件表明 symbolAsymbolBsymbolC 与版本 SUNW_1.1 关联,symbolDsymbolESUNW_1.2 关联,并且 SUNW_1.2 继承了与 SUNW_1.1 关联的所有符号。 符号 __fooimpl 与不同名称的符号集关联,该符号集没有带编号的继承链。

在生成过程中,链接编辑器会检查应用程序使用的符号,并且记录应用程序中与这些符号相关的符号集名称。如果是一系列具有继承链关系的命名集,则链接编辑器将记录包含应用程序所使用的所有符号的最小命名集。如果应用程序仅使用 symbolAsymbolB,则链接编辑器将记录 SUNW_1.1 的某一依赖项。如果应用程序使用 symbolAsymbolBsymbolD,则链接编辑器将记录 SUNW_1.2 的某一依赖项,因为 SUNW_1.2 包括 SUNW_1.1

在运行时,链接程序会验证在所链接的库中,是否存在应用程序中作为依赖项而记录的版本名称。通过此过程可以快速验证是否存在所需的符号。有关更多详细信息,请参见《链接程序和库指南》


注 –

映射文件中的 local: * 指令表示,对于库中任何不与命名的符号集显式关联的符号,其作用域均为库局部作用域。此类局部作用域符号在库外部不可见。此约定可以确保符号仅与符号版本控制名称关联时才可见。


使用符号版本控制标记 Solaris ABI

由于库中所有可见的符号都属于某个命名的符号集,因此可以使用命名方案来标记符号的 ABI 状态。这种标记操作可以通过将所有专用接口与以 SUNWprivate 开头的符号集名称关联来完成。公共接口以其他名称开头,具体如下:

这些已命名的公共符号集按照 major.minor 编号方案进行编号。如果集合中包括新符号,则集合的次版本号将增加。如果现有符号的更改致使符号与其以前的行为不兼容,则包含此符号的集合的主版本号将增加。如果现有符号更改且与以前不兼容,则库文件名中的版本号也将增加。

因此,Solaris 库 ABI 的定义会包含在多个库中,并且包括与不以 SUNWprivate 开头的符号版本名称关联的符号集。可以使用 pvs 命令列出库中的符号。