版本符号节由 SHT_SUNW_versym 类型定义。此节由具有以下结构的元素数组构成。
typedef Elf32_Half Elf32_Versym; typedef Elf64_Half Elf64_Versym;
数组元素的数量必须等于关联的符号表中包含的符号表项的数量。此数量由节的 sh_link 值确定。数组的每个元素都包含一个索引,该索引可以包含下表中显示的值。
|
可以为符号指定特殊的保留索引 0。可以出于以下任意原因指定此索引。
始终为非全局符号指定 VER_NDX_LOCAL。然而,这在实际操作中很少见。版本控制节通常仅与只包含全局符号的动态符号表 .dynsym 一起创建。
没有 SHT_SUNW_verdef 版本定义节的目标文件中定义的全局符号。
没有 SHT_SUNW_verneed 版本依赖性节的目标文件中定义的未定义全局符号。或者,其中的版本依赖性节未指定版本索引的目标文件中定义的未定义全局符号。
符号表的第一项始终为 NULL。此项始终接收 VER_NDX_LOCAL,但该值没有任何特定意义。
目标文件所定义的版本指定从 1 开始的版本索引,并且随版本变化每次增加 1。索引 1 保留用于第一个全局版本。如果该目标文件没有 SHT_SUNW_verdef 版本定义节,则该目标文件定义的所有全局符号均接收索引 1。如果目标文件具有版本定义节,则 VER_NDX_GLOBAL 将仅指向第一个此类版本。
其他 SHT_SUNW_verneed 依赖项中目标文件所需的版本将指定从 1 到最终版本定义索引之间的版本索引。这些索引也随版本变化每次增加 1。由于索引 1 始终保留用于 VER_NDX_GLOBAL,依赖项版本可用的第一个索引为 2。
在 Oracle Solaris 10 发行版及更低 Solaris 版本中,不向 SHT_SUNW_verneed 依赖项版本指定版本索引。在此类目标文件中,任何符号引用都具有版本索引 0,这表示该符号没有可用的版本控制信息。