Creating a Weak Version Definition
Internal changes to an object that do not require the introduction of a new interface definition can be defined by creating a weak version definition. Examples of such changes are bug fixes or performance improvements. Such a version definition is empty. The version definition has no global interface symbols associated with the definition.
For example, suppose the data file
data.c
, used in the previous examples,
is updated to provide more detailed string
definitions.
$ cat data.c
const char *_foo1 = "string used by function foo1()\n";
const char *_foo2 = "string used by function foo2()\n";
A weak version definition can be introduced to identify this change.
$ cat mapfile $mapfile_version 2 SYMBOL_VERSION SUNW_1.1 { # Release X global: foo1; local: *; }; SYMBOL_VERSION SUNW_1.2 { # Release X+1 global: foo2; } SUNW_1.1; SYMBOL_VERSION SUNW_1.2.1 { } SUNW_1.2; # Release X+2 $ cc -o libfoo.so.1 -M mapfile -G foo.o data.o $ pvs -dv libfoo.so.1 libfoo.so.1; SUNW_1.1; SUNW_1.2: {SUNW_1.1}; SUNW_1.2.1 [WEAK]: {SUNW_1.2};
The empty version definition is signified by the weak label. These weak version definitions enable applications to verify the existence of a particular implementation detail. An application can bind to the version definition that is associated with an implementation detail that the application requires. The section Binding to a Version Definition illustrates how these definitions can be used in more detail.