222 Chapter 6
Shared Library Management Routines
The shl_load Shared Library Management Routines
BIND_FIRST | BIND_TOGETHER causes the library being loaded and its
dependent libraries to be bound all at the same time, thereby resolving
interdependencies. If you are not using BIND_FIRST, libraries are bound
together by default so this option has no effect.
BIND_BREADTH_FIRST Modifier
64-bit mode only:
This flag causes the dependent libraries to be loaded breadth first. By
default, the 64-bit mode shl_load loads dependent libraries depth-first.
This modifier overrides the default load order.
Binding Flags Examples
Suppose you have the libraries libE.sl, libF.sl, and libG.sl. The
libE library depends on libF and libF depends on libG. In addition,
libG depends on libF—libF and libG are interdependent. Your
program loads libE.sl with shl_load().
When using BIND_DEFERRED or BIND_IMMEDIATE without
BIND_FIRST, these libraries are loaded such that all symbols are visible
and the interdependencies are resolved:
shl_t libE;
libE = shl_load("libE.sl", BIND_IMMEDIATE, 0);
shl_load succeeds.
When using BIND_IMMEDIATE | BIND_FIRST, however, libG is loaded
and bound first and since it depends on libF, an error results because
the needed symbols in libF are not yet available:
libE = shl_load("libE.sl", BIND_IMMEDIATE | BIND_FIRST, 0);
shl_load fails.
Using BIND_IMMEDIATE | BIND_FIRST | BIND_TOGETHER loads
libE, libF, and libG together and correctly resolves all symbols:
libE = shl_load("libE.sl", BIND_IMMEDIATE | BIND_FIRST | BIND_TOG
ETHER, 0);
shl_load succeeds.
The shl_findsym Routine
Obtains the address of an exported symbol from a shared library. To call
a routine or access data in an explicitly loaded library, first get the
address of the routine or data with shl_findsym.