146 Chapter 5
Creating and Using Libraries
Creating Shared Libraries
You may be surprised to find that a shared library exports many more
symbols than necessary for code that uses the library. These extra
symbols add to the size of the library's symbol table and can even
degrade performance (since the dynamic loader has to search a
larger-than-necessary number of symbols).
One possible way to improve shared library performance is to export only
those symbols that need exporting from a library. To control which
symbols are exported, use either the +e or the -h option to the ld
command. When +e options are specified, the linker exports only those
symbols specified by +e options. The -h option causes the linker to hide
the specified symbols. (For details on using these options, see “Hiding
Symbols with -h” on page 81 and “Exporting Symbols with +e” on page
79.)
As an example, suppose you've created a shared library that defines the
procedures init_prog and quit_prog and the global variable
prog_state. To ensure that only these symbols are exported from the
library, specify these options when creating the library:
+e init_prog +e quit_prog +e prog_state
If you have to export many symbols, you may find it convenient to use the
-c file option, which allows you to specify linker options in file. For
instance, you could specify the above options in a file named
export_opts as:
+e init_prog
+e quit_prog
+e prog_state
Then you would specify the following option on the linker command line:
-c export_opts
(For details on the -c option, see “Passing Linker Options in a file with
-c” on page 86.)
Placing Frequently-Called Routines Together
When the linker creates a shared library, it places the PIC object
modules into the library in the order in which they are specified on the
linker command line. The order in which the modules appear can greatly
affect performance. For instance, consider the following modules:
a.o Calls routines in c.o heavily, and its routines are
called frequently by c.o.