Chapter 5 127
Creating and Using Libraries
What are Shared Libraries?
Default Behavior When Searching for
Libraries at Run Time
By default, if the dynamic loader cannot find a shared library from the
list, it generates a run-time error and the program aborts. For example,
in 32-bit mode, suppose that during development, a program is linked
with the shared library liblocal.sl in your current working directory
(say, /users/hyperturbo):
$ ld /opt/langtools/lib/crt0.o prog.o -lc liblocal.sl
In 32-bit mode, the linker records the path name of liblocal.sl in the
a.out file as /users/hyperturbo/liblocal.sl. When shipping this
application to users, you must ensure that (1) they have a copy of
liblocal.sl on their system, and (2) it is in the same location as it was
when you linked the final application. Otherwise, when the users of your
application run it, the dynamic loader will look for
/users/hyperturbo/liblocal.sl, fail to find it, and the program
will abort.
In 64-bit mode, the linker records ./liblocal.sl.
This is more of a concern with non-standard libraries—that is, libraries
not found in /usr/lib or /usr/lib/pa20_64. There is little chance of
the standard libraries not being in these directories.
Caution on Using Dynamic Library Searching
If different versions of a library exist on your system, be aware that the
dynamic loader may get the wrong version of the library when dynamic
library searching is enabled with SHLIB_PATH or +b. For instance, you
may want a program to use the PA1.1 libraries found in the
/usr/lib/pa1.1 directory; but through a combination of SHLIB_PATH
settings and +b options, the dynamic loader ends up loading versions
found in /usr/lib instead. If this happens, make sure that
SHLIB_PATH and +b are set to avoid such conflicts.