有时,新的行业标准中会采用供应商接口提供的符号。创建新标准接口时,请务必维护共享库提供的原始接口定义。创建一些中间版本定义,以便根据它们生成新标准定义和原始接口定义。
以下 mapfile 示例显示了添加新的行业标准接口 STAND.1。此接口包含新符号 foo4 以及现有符号 foo3 和 foo1,它们最初分别通过接口 SUNW_1.2 和 SUNW_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; }; |
符号 foo3 和 foo1 被引入各自的中间接口定义(用于创建原始接口定义和新接口定义)中。
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 仍然提供符号 foo1、foo2 和 foo3。
$ 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); |
实际上,很少需要按这种方式提升版本绑定。因为很少会引入新的标准二进制接口,而且大多数应用程序都引用一个接口系列中的许多符号。