When used with BIND_DEFERRED and the BIND_NONFATAL modifier, it has the same behavior, except that when a symbol definition cannot be found, the dynamic loader looks in the global symbol set. If a definition still cannot be found within the global set, a run-time symbol-binding error occurs.

BIND_TOGETHER Modifier

BIND_TOGETHER modifies the behavior of BIND_FIRST. When the library being loaded has dependencies, BIND_FIRST causes each dependent library to be loaded and bound separately. If the libraries have interdependencies, the load may fail because the needed symbols are not available when needed.

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

This flag causes the dependent libraries to be loaded breadth first. By default, the PA-64 and IPF mode shl_load loads dependent libraries depth-first. This modifier overrides the default load order.

Binding Flags Examples

Suppose you have the libraries libE.so, libF.so, and libG.so. The libE library depends onlibF and libF depends on libG. In addition, libG depends on libF-libFand libG are interdependent. Your program loads libE.so 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.so", BIND_IMMEDIATE, 0); shl_load succeeds.

When using BIND_IMMEDIATE BIND_FIRST, however, libG is loaded and bound first and because it depends on libF, an error results because the needed symbols in libF are not yet available:

libE = shl_load("libE.so", 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.so", BIND_IMMEDIATE BIND_FIRST BIND_TOGETHER, 0); shl_load succeeds.

The shl_findsym Routine

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.

Syntax

int shl_findsym( shl_t * handle, const char * sym, short type, void * value )

172 Shared Library Management Routines

Page 172
Image 172
HP UX Software Transition Kit (STK) manual Shlfindsym Routine, Bindtogether Modifier, Bindbreadthfirst Modifier