Chapter 5 185
Creating and Using Libraries
Using Shared Libraries in 64-bit mode
If you use mixed mode shared libraries, you get behavior based on the
first mode encountered. At runtime, the dynamic loader does a
depth-first search if the dependent libraries at the highest level are
compatibility mode libraries. Otherwise, it does breadth-first searching.
This applies to all dependent libraries of the incomplete executable file.
The loader cannot toggle back and forth between depth-first and
breadth-first at the library level, so the first dependent library it sees
determines which search method to use.
For example:
# build standard mode dlls
# libfile1.sl is a dependent of libfile2.sl
ld -b file1.o -o libfile1.sl +h libfile1.1
ld -b file2.o -o libfile2.sl +h libfile2.1 -L. -lfile1
# build compatibility mode dlls
# libfile3.sl is a dependent of libfile4.sl
ld -b file3.o -o libfile3.sl +h libfile3.1
ld -b file4.o -o libfile4.sl +h libfile4.1 -L. -lfile3 +compat
ln -s libfile1.sl libfile1.1
ln -s libfile3.sl libfile3.1
# build a dll using both standard and compatibility mode dependent
dlls
# since we didn’t specify +compat, the resulting dll is a standard
mode dll
ld -b file5.o -o libfile5.sl +h libfile5.1 -L. -lfile4 -lfile2
ln -s libfile4.sl libfile4.1
ln -s libfile2.sl libfile2.1
ld main.o -L. -lfile5 -lc
The resulting a.out has standard mode dependents, libfile5.sl and
libc.sl. libfile5.sl has two dependents,: libfile4.sl and
libfile2.sl. libfile4.sl is a compatibility mode library, and has a
dependent, libfile3.sl. libfile2.sl is a standard mode library,
and has a dependent, libfile1.sl. The dynamic loader does a
breadth-first search of all dependent libraries needed by a.out because
the link was done without +compat and libfile5.sl is a standard