Chapter 6 205
Shared Library Management Routines
Initializers for Shared Libraries
Accessing Initializers' Addresses . Prior to the HP-UX 10.0
release, initializer's addresses could be accessed through the initializer
field of the shared library descriptor which is returned from a call to
shl_get(). To support multiple initializers, the shl_getsymbols()
routine has been enhanced to support the return of the initializer's
address.
If only one initializer is specified for a given library, its address is still
available through the initializer field of a shared library descriptor. If
more than one initializer is specified, the initializer field will be set to
NO_INITIALIZER. Access to multiple initializers can then be
accomplished through the use of shl_getsymbols(). (The
shl_getsymbols() routine can also access a single initializer.)
NOTE shl_getsymbols() may not return the initializer which was invoked
for a given library if a more visible initializer symbol is defined after the
library being queried has been loaded. This can occur through the use of
shl_definesym() and by explicitly loading a more visible symbol using
the BIND_FIRST flag upon loading.
To access initializers, a new flag, INITIALIZERS, has been defined for
the shl_getsymbols() routine. It can be ORed with the NO_VALUES
and GLOBAL_VALUES flags. For example,
shl_getsymbols(handle,
TYPE_PROCEDURE,
INITIALIZERS | GLOBAL_VALUES,
malloc,
&symbol_array);
If the GLOBAL_VALUES modifier is not used and the initializer is defined
in another shared library or in the program file, shl_getsymbols()
does not find the initializer for the requested library because it is not
defined within the library.
For more information on the usage of shl_getsymbols(), see “The
shl_getsymbols Routine”.
Example: An Initializer for Each Library
One way to use initializers is to define a unique initializer for each
library. For instance, the following example shows the source code for a
library named libfoo.sl that contains an initializer named init_foo: