Recording a Shared Object Name
The recording of a dependency in a dynamic
object will, by default, be the file name of the associated
shared object as it is referenced by the link-editor. For example,
the following dynamic executables, that are built against the same
shared object libfoo.so
, result in different
interpretations of the same dependency.
$ cc -o ../tmp/libfoo.so -G foo.o $ cc -o prog main.o -L../tmp -lfoo $ elfdump -d prog | grep NEEDED [1] NEEDED 0x123 libfoo.so.1 $ cc -o prog main.o ../tmp/libfoo.so $ elfdump -d prog | grep NEEDED [1] NEEDED 0x123 ../tmp/libfoo.so $ cc -o prog main.o /usr/tmp/libfoo.so $ elfdump -d prog | grep NEEDED [1] NEEDED 0x123 /usr/tmp/libfoo.so
As these examples show, this mechanism of recording dependencies can result in inconsistencies due to different compilation techniques. Also, the location of a shared object as referenced during the link-edit might differ from the eventual location of the shared object on an installed system. To provide a more consistent means of specifying dependencies, shared objects can record within themselves the file name by which they should be referenced at runtime.
During the link-edit of a shared object, its runtime
name can be recorded within the shared object itself by using the
-h
option. In the following example, the
shared object's runtime name libfoo.so.1
, is
recorded within the file itself. This identification is known as an
soname
.
$ cc -o ../tmp/libfoo.so -G -K pic -h libfoo.so.1 foo.c
The following example shows how the
soname recording can be displayed using
elfdump
(1) and referring to the entry that has
the SONAME
tag.
$ elfdump -d ../tmp/libfoo.so | grep SONAME
[1] SONAME 0x123 libfoo.so.1
When the link-editor processes a shared object that contains an soname, this is the name that is recorded as a dependency within the output file being generated.
If this new version of libfoo.so
is used during
the creation of the dynamic executable prog
from the previous example, all three methods of creating the
executable result in the same dependency recording.
$ cc -o prog main.o -L../tmp -lfoo $ elfdump -d prog | grep NEEDED [1] NEEDED 0x123 libfoo.so $ cc -o prog main.o ../tmp/libfoo.so $ elfdump -d prog | grep NEEDED [1] NEEDED 0x123 libfoo.so $ cc -o prog main.o /usr/tmp/libfoo.so $ elfdump -d prog | grep NEEDED [1] NEEDED 0x123 libfoo.so
In the previous examples, the -h
option is used to
specify a simple file name, that has no '/' in the name. This
convention enables the runtime linker to use a set of rules to
locate the actual file. See Locating Shared Object Dependencies for more details.