User's Manual
is a date, specified with a compiler directive in the source file. The syntax of the version number
directive depends on the language:
#pragma HP_SHLIB_VERSION "date"
C and C++:
$SHLIB_VERSION 'date'
FORTRAN:
$SHLIB_VERSION 'date'$
Pascal:
The date argument in all three directives is of the form month/year. The month must be 1 through
12, corresponding to January through December. The year can be specified as either the last two
digits of the year (94 for 1994) or a full year specification (1994). Two-digit year codes from 00
through 40 represent the years 2000 through 2040. This directive must be used only if incompatible
changes are made to a source file. If a version number directive is not present in a source file, the
version number of all symbols defined in the object module defaults to 1/90.
Shared Library Dependencies and Version Control
A shared library as a whole can be thought of as having a version number itself. This version
number is the most recent of the versioned symbols in the library and any dependent libraries.
When a shared library is built with a dependent shared library, the version number of the dependent
library used during the link is recorded with the dependency.
When shl_load(3X) is called to load a shared library, the latest version of the library is loaded. If
that library has dependencies, the dynamic loader (dld.sl(5)) loads the versions of the dependent
libraries that were recorded in the dependency list. Note that these are not necessarily the most
recent versions of the dependent libraries. When dld.sl loads a particular version of a shared
library, it loads the same version of any dependent libraries.
If a shared library lists a second shared library as a dependency, dld.sl generates an error if
the second shared library has a version number which is older than the version number recorded
with the dependency. This means that the first library was built using a more recent version of the
second library than the version that dld.sl currently finds.
Adding New Versions to a Shared Library
To rebuild a shared library with new versions of object files, run ld again with the newly compiled
object files. For example, suppose you want to add new functionality to the routines in length.c,
making them incompatible with existing programs that call libunits.sl. Before making the
changes, make a copy of the existing length.c and name it oldlength.c. Then change the
routines in length.c with the version directive specifying the current month and date. The following
shows the new length.c file:
#pragma HP_SHLIB_VERSION "11/93" /* date is November 1993 */
/*
* New version of "in_to_cm" also returns a character string
* "cmstr" with the converted value in ASCII form.
*/
float in_to_cm(float in, char *cmstr) /* convert in to cm */
{
. . . /* build "cmstr" */
return(in * 2.54);
}
. . . /* other length conversion routines */
To update libunits.sl to include the new length.c routines, copy the old version of length.o
to oldlength.o. Then compile length.c and rebuild the library with the new length.o and
oldlength.o:
$ cp length.c oldlength.c Save the old source.
$ mv length.o oldlength.o Save old length.o.
. . . Make new length.c.
114 Creating and Using Libraries