148 Chapter 5
Creating and Using Libraries
Creating Shared Libraries
y.o
d.o
Notice that d.o is now closer to x.o and y.o, which call it. However, this
is still not the best information to use because a.o and b.o are
separated from x.o and y.o by the module e.o, which is not called by
any modules. The actual optimal order might be more like this:
a.o b.o x.o y.o d.o e.o
Again, the use of lorder and tsort is not perfect, but it may give you
leads on how to best order the modules. You may want to experiment to
see what ordering gives the best performance.
Making Shared Libraries Non-Writable
You may get an additional performance gain by ensuring that no shared
libraries have write permissions. Programs that use more than one
writable library can experience significantly degraded loading time. The
following chmod command gives shared libraries the correct permissions
for best load-time performance:
$ chmod 555 libname
Using the +ESlit Option to cc
Normally, the C compiler places constant data in the data space. If such
data is used in a shared library, each process will get its own copy of the
data, in spite of the fact that the data is constant and should not change.
This can result in some performance degradation.
To get around this, use the C compiler's +ESlit option, which places
constant data in the $LIT$ text space (or in 64-bit mode, in a .text text
segment) instead of the data space. This results in one copy of the
constant data being shared among all processes that use the library.
NOTE This option requires that programs not write into constant strings and
data. In addition, structures with embedded initialized pointers won't
work because the pointers cannot be relocated since they are in read-only
$TEXT$ space. In this case, the linker outputs the error message
"Invalid loader fixup needed".