Versioning Sections

Objects created by the link-editor can contain two types of versioning information.

Version definitions provide associations of global
symbols and are implemented using sections of type SHT_SUNW_verdef and
SHT_SUNW_versym.

Version dependencies indicate the version definition
requirements from other object dependencies and are implemented using sections of type
SHT_SUNW_verneed and SHT_SUNW_versym.

The structures that form these sections are defined in
sys/link.h. Sections that contain versioning information are named
.SUNW_version.

Version Definition Section

This section is defined by the type SHT_SUNW_verdef. If this
section exists, a SHT_SUNW_versym section must also exist. These two
structures provide an association of symbols to version definitions within the file. See
Creating a Version Definition. Elements of this
section have the following structure.

This member identifies the version of the structure, as listed in the following
table.

Name

Value

Meaning

VER_DEF_NONE

0

Invalid version.

VER_DEF_CURRENT

>=1

Current version.

The value 1 signifies the original section format. Extensions require new versions
with higher numbers. The value of VER_DEF_CURRENT changes as
necessary to reflect the current version number.

vd_flags

This member holds version definition-specific information, as listed in the
following table.

Name

Value

Meaning

VER_FLG_BASE

0x1

Version definition of the file.

VER_FLG_WEAK

0x2

Weak version identifier.

The base version definition is always present when version definitions, or symbol
auto-reduction, have been applied to the file. The base version provides a default
version for the files reserved symbols. A weak version definition has no symbols
associated with the version. See Creating a Weak Version Definition.

vd_ndx

The version index. Each version definition has a unique index that is used
to associate SHT_SUNW_versym entries to the appropriate version
definition.

vd_cnt

The number of elements in the Elf32_Verdaux array.

vd_hash

The hash value of the version definition name. This value is generated using the
same hashing function that is described in Hash Table Section.

vd_aux

The byte offset from the start of this Elf32_Verdef entry to
the Elf32_Verdaux array of version definition names. The first
element of the array must exist. This element points to the version definition string
this structure defines. Additional elements can be present. The number of elements is
indicated by the vd_cnt value. These elements represent the
dependencies of this version definition. Each of these dependencies will have its own
version definition structure.

vd_next

The byte offset from the start of this Elf32_Verdef structure
to the next Elf32_Verdef entry.

vda_name

The string table offset to a null-terminated string, giving the name of the
version definition.

vda_next

The byte offset from the start of this Elf32_Verdaux entry to
the next Elf32_Verdaux entry.

Version Dependency Section

The version dependency section is defined by the type
SHT_SUNW_verneed. This section complements the dynamic dependency
requirements of the file by indicating the version definitions required from these
dependencies. A recording is made in this section only if a dependency contains version
definitions. Elements of this section have the following structure.

This member identifies the version of the structure, as listed in the following
table.

Name

Value

Meaning

VER_NEED_NONE

0

Invalid version.

VER_NEED_CURRENT

>=1

Current version.

The value 1 signifies the original section format. Extensions require new versions
with higher numbers. The value of VER_NEED_CURRENT changes as
necessary to reflect the current version number.

vn_cnt

The number of elements in the Elf32_Vernaux array.

vn_file

The string table offset to a null-terminated string, providing the file name of a
version dependency. This name matches one of the .dynamic
dependencies found in the file. See Dynamic Section.

vn_aux

The byte offset, from the start of this Elf32_Verneed entry, to
the Elf32_Vernaux array of version definitions that are required
from the associated file dependency. At least one version dependency must exist.
Additional version dependencies can be present, the number being indicated by the
vn_cnt value.

vn_next

The byte offset, from the start of this Elf32_Verneed entry, to
the next Elf32_Verneed entry.

vna_hash

The hash value of the version dependency name. This value is generated using the
same hashing function that is described in Hash Table Section.

vna_flags

Version dependency specific information, as listed in the following table.

Name

Value

Meaning

VER_FLG_WEAK

0x2

Weak version identifier.

VER_FLG_INFO

0x4

SHT_SUNW_versym reference exists for informational
purposes, and need not be validated at runtime.

A weak version dependency indicates an original binding to a weak version
definition.

vna_other

If non-zero, the version index assigned to this dependency version. This index is
used within the SHT_SUNW_versym to assign global symbol references
to this version.

Versions of Solaris up to and including the Oracle Solaris 10 release, did
not assign version symbol indexes to dependency versions. In these objects, the value
of vna_other is 0.

vna_name

The string table offset to a null-terminated string, giving the name of the
version dependency.

vna_next

The byte offset from the start of this Elf32_Vernaux entry to
the next Elf32_Vernaux entry.

Version Symbol Section

The version symbol section is defined by the type
SHT_SUNW_versym. This section consists of an array of elements of the
following structure.

typedef Elf32_Half Elf32_Versym;
typedef Elf64_Half Elf64_Versym;

The number of elements of the array must equal the number of symbol table entries that
are contained in the associated symbol table. This number is determined by the section's
sh_link value. Each element of the array contains a single index that
can have the values shown in the following table.

Table 39 ELF Version Dependency Indexes

Name

Value

Meaning

VER_NDX_LOCAL

0

Symbol has local scope.

VER_NDX_GLOBAL

1

Symbol has global scope and is assigned to the base version definition.

VER_NDX_GLOBAL

>1

Symbol has global scope and is assigned to a user-defined version definition,
SHT_SUNW_verdef, or a version dependency,
SHT_SUNW_verneed.

A symbol may be assigned the special reserved index 0. This
index can be assigned for any of the following reasons.

A non-global symbol is always assigned VER_NDX_LOCAL. However,
this is rare in practice. Versioning sections are usually created only in conjunction
with the dynamic symbol table, .dynsym, which only contains global
symbols.

A global symbol defined within an object that does not have a
SHT_SUNW_verdef version definition section.

An undefined global symbol defined within an object that does not have a
SHT_SUNW_verneed version dependency section. Or, an undefined
global symbol defined within an object in which the version dependency section does not
assign version indexes.

The first entry of a symbol table is always NULL. This entry
always receives VER_NDX_LOCAL, however the value has no particular
meaning.

Versions defined by an object are assigned version indexes starting at
1 and incremented by 1 for each version. Index
1 is reserved for the first global version. If the object does not have
a SHT_SUNW_verdef version definition section, then all the global symbols
defined by the object receive index 1. If the object does have a version
definition section, then VER_NDX_GLOBAL simply refers to the first such
version.

Versions required by the object from other SHT_SUNW_verneed
dependencies, are assigned version indexes that start 1 past the final
version definition index. These indexes are also incremented by 1 for
each version. Since index 1 is always reserved for
VER_NDX_GLOBAL, the first possible index for a dependency version is
2.

Versions of Solaris up to and including the Oracle Solaris 10 release, did not
assign a version index to a SHT_SUNW_verneed dependency version. In such
an object, any symbol reference had a version index of 0 indicating that
no versioning information is available for that symbol.