链接程序和库指南

将符号迁移到标准接口

有时,新的行业标准中会采用供应商接口提供的符号。创建新标准接口时,请务必维护共享库提供的原始接口定义。创建一些中间版本定义,以便根据它们生成新标准定义和原始接口定义。

以下 mapfile 示例显示了添加新的行业标准接口 STAND.1。此接口包含新符号 foo4 以及现有符号 foo3foo1,它们最初分别通过接口 SUNW_1.2SUNW_1.1 提供。


$ cat mapfile

STAND.1 {                    # Release X+2.

        global:

                foo4;

} STAND.0.1 STAND.0.2;



SUNW_1.2 {                   # Release X+1.

        global:

                SUNW_1.2;

} STAND.0.1 SUNW_1.1;



SUNW_1.1.1 { } SUNW_1.1;     # Release X+1.



SUNW_1.1 {                   # Release X.

        global:

                foo2;

        local:

                *;

} STAND.0.2;

                             # Subversion - providing for

STAND.0.1 {                  # SUNW_1.2 and STAND.1 interfaces.

        global:

                foo3;

};

                             # Subversion - providing for

STAND.0.2 {                  # SUNW_1.1 and STAND.1 interfaces.

        global:

                foo1;

};

符号 foo3foo1 被引入各自的中间接口定义(用于创建原始接口定义和新接口定义)中。

SUNW_1.2 接口的新定义引用了自身的版本定义符号。如果没有此引用,SUNW_1.2 接口将不包含任何即时符号引用,从而将归类为弱版本定义 (weak version definition)。

将符号定义迁移到标准接口中时,任何原始接口定义都必须继续表示相同符号列表。可以使用 pvs(1) 验证此要求。以下示例显示了软件发行版 X+1 中存在的 SUNW_1.2 接口的符号列表。


$ pvs -ds -N SUNW_1.2 libfoo.so.1

        SUNW_1.2:

                foo3;

        SUNW_1.1:

                foo2;

                foo1;

尽管新标准接口在软件发行版 X+2 中的引入更改了可用的接口版本定义,但每个原始接口提供的符号列表均保持不变。以下示例显示了接口 SUNW_1.2 仍然提供符号 foo1foo2foo3


$ pvs -ds -N SUNW_1.2 libfoo.so.1

        SUNW_1.2:

        STAND.0.1:

                foo3;

        SUNW_1.1:

                foo2;

        STAND.0.2:

                foo1;

应用程序可能只引用新的子版本中的一个。在这种情况下,尝试在上一个发行版中运行此应用程序将导致运行时版本控制错误。 请参见绑定到版本定义

通过直接引用现有的版本名称,可以提升应用程序的版本绑定。 请参见到其他版本定义的绑定。例如,如果一个应用程序只引用共享库 libfoo.so.1 的符号 foo1,则其版本引用为 STAND.0.2。要使此应用程序能够在以前的发行版上运行,可以使用版本控制指令 mapfile 将版本绑定提升到 SUNW_1.1


$ cat prog.c

extern void foo1();



main()

{

        foo1();

}

$ cc -o prog prog.c -L. -R. -lfoo

$ pvs -r prog

        libfoo.so.1 (STAND.0.2);



$ cat mapfile

libfoo.so - SUNW_1.1 $ADDVERS=SUNW_1.1;

$ cc -M mapfile -o prog prog.c -L. -R. -lfoo

$ pvs -r prog

        libfoo.so.1 (SUNW_1.1);

实际上,很少需要按这种方式提升版本绑定。因为很少会引入新的标准二进制接口,而且大多数应用程序都引用一个接口系列中的许多符号。