编程接口指南

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