Figure 22 Example 2: Using shl_load(3X): Rebuilding the Shared Library

Here's where the problem shows up. If you do not relink the application, main.o, and just run a.out with the new version of lib3.so, the program aborts since f2() is not available in the program's address space. The reference to f2() from f3() remains unsatisfied, generating the PA-32 error message:

Figure 23 Example 2: Using shl_load(3X): Problem of Unsatisfied Symbol

$ a.out

Illegal instruction (coredump)

Example 3: Hidden Definitions

This example shows how mixing archive libraries and shared libraries can lead to multiple definitions in the application and unexpected results. If one of the definitions happens to be a data symbol, the results can be catastrophic. If any of the definitions are code symbols, different versions of the same routine can end up being used in the application. This can lead to incompatibilities.

Duplicate definitions can occur when a dependent shared library is updated to refer to a symbol contained in the program file, but not visible to the shared library. The new symbol import must be satisfied somehow by either adding the symbol to the library or by updating the shared library dependency list. Otherwise the application must be relinked.

Using an archive version of libc in an application using shared libraries is the most common cause of duplicate definitions. Remember that symbols not referenced by a shared library at link time are not exported by default.

NOTE: Duplicate definitions can be avoided if any or all symbols that may be referenced by a shared library are exported from the application at link time. Shared libraries always reference the first occurrence of a definition. In the following example, the first definition is in the executable file, a.out. See the -Eoption and +e symbol option described in ld(1) and “Exporting Symbols from main with -E” (page 38) , “Exporting Symbols with +ee” (page 38), and “Exporting Symbols with +e” (page 37).

The following example illustrates this situation. Suppose you have a main program, main(), and three functions, f1(), f2(), and f3() each in a separate source file. main() calls f1(), f2(), and f3().

122 Creating and Using Libraries