LD.SO.1(1) User Commands LD.SO.1(1)

NAME


ld.so.1 - runtime linker for dynamic objects

SYNOPSIS


/lib/ld.so.1


/lib/ld.so.1 [-e envar] dynamic-object [object args]...


DESCRIPTION


Dynamic applications consist of one or more dynamic objects. A
dynamic application is typically a dynamic executable and one or more
shared object dependencies. As part of the initialization and
execution of a dynamic application, an interpreter is called. This
interpreter completes the binding of the application to its shared
object dependencies. In Solaris, this interpreter is referred to as
the runtime linker.


During the link-editing of a dynamic executable, a special .interp
section, together with an associated program header, is created. This
section contains a path name specifying the program's interpreter. An
interpreter path name can be specified when the executable is
constructed using the -I option to ld(1), the link-editor. The
default name supplied by the link-editor is the name of the runtime
linker, ld.so.1.


During the process of executing a dynamic executable, the kernel maps
the file, and locates the required interpreter. See exec(2) and
mmapobj(2). The kernel maps in, and transfers control to, this
interpreter. Sufficient information is passed to the interpreter to
allow the interpreter to continue to bind, and then execute the
application.


In addition to initializing an application, the runtime linker
provides services that allow the application to extend its address
space. Additional shared objects can be mapped, and symbols within
the shared objects can be bound to.


The runtime linker performs the following functions:

o A configuration file, if in existence, is processed.
Configuration files can be employed to alter default
search paths, provide a directory cache, and provide
alternative object dependencies. See crle(1). By default,
for 32-bit objects, the configuration file
/var/ld/ld.config is used. For 64-bit objects, the default
configuration file /var/ld/64/ld.config is used.
Alternative configuration files can be specified with the
LD_CONFIG environment variable. Alternative configuration
files can also be encoded within a dynamic executable by
using the -c option of ld(1).

o The runtime linker analyzes the application's dynamic
information section, .dynamic, to determine which shared
object dependencies are required.

o The runtime linker then locates and maps in these
dependencies. The dynamic information section of each
dependency is then analyzed to determine if any additional
dependencies are required.

o Once all the shared object dependencies are loaded, the
runtime linker performs any necessary relocations. These
relocations bind the shared objects in preparation for
process execution.

o Any initialization functions provided by the shared object
dependencies and, possibly, by the dynamic executable are
called. The functions are called in the reverse order of
the topologically sorted dependencies. If cyclic
dependencies exist, the initialization functions are
called using the sorted order with the cycle removed.
ldd(1) can be used to display the initialization order of
shared object dependencies.

o Control is passed to the application.

o During the application's execution, the runtime linker can
be called upon to perform any delayed function binding.

o If any shared objects are deleted from the process,
finalization functions are called. By default, these
functions are called in the order of the topologically
sorted dependencies.

o The application can also call upon the services of the
runtime linker to acquire additional shared objects by
using dlopen(3C). Symbols provided by these objects, can
be bound to using dlsym(3C).


Further details on each of the previous topics can be found in the
Linker and Libraries Guide.


The runtime linker uses a prescribed search path for locating the
dynamic dependencies of an object. The default search paths are the
runpath recorded in the object, followed by a series of defaults. For
32-bit objects, the defaults are /lib followed by /usr/lib. For
64-bit objects, the defaults are /lib/64 followed by /usr/lib/64.
These defaults component can be modified using a configuration file
that is created with crle(1). The runpath is specified when the
dynamic object is constructed using the -R option to ld(1). The
environment variable LD_LIBRARY_PATH can be used to indicate
directories to be searched before the default directories.

Command Line Usage


Typically, the runtime linker is invoked indirectly through executing
a dynamic executable that declares the runtime linker as its
interpreter. The runtime linker can also be executed directly from
the command line. This mechanism is most often employed to experiment
with new implementations of the runtime linker. Arguments that are
supplied on the command line consist of options that are applicable
to the runtime linker. Following these options is the name of the
dynamic object to be executed, and any options required by this
object. Effectively, the runtime linker replaces any interpreter
specified by the dynamic object.


The following option is supported:

-e envar
Specify a runtime linker specific environment variable.
See ENVIRONMENT VARIABLES.


ENVIRONMENT VARIABLES


Each environment variable can be specified with a _32 or _64 suffix.
This makes the environment variable specific, respectively, to 32-bit
or 64-bit processes. This environment variable overrides any non-
suffixed version of the environment variable that might be in effect.
Environment variables specified without a value, that have a _32 or
_64 suffix, effectively cancel any associated generic environment
variable setting.

LD_AUDIT, LD_AUDIT_32, and LD_AUDIT_64

A colon-separated list of objects that are loaded by the runtime
linker. As each object is loaded, the object is examined for
Link-Auditing interface routines. The routines that are present
are called as specified in the Link-Auditing interface described
in the Linker and Libraries Guide. Also, see the -p and -P
options of ld(1).


LD_BIND_LAZY, LD_BIND_LAZY_32, and LD_BIND_LAZY_64

The runtime linker's default mode of performing lazy binding can
be enforced by setting the environment variable LD_BIND_LAZY to
any non-null value. This setting causes the runtime linker to
perform only lazy reference relocations for all objects that are
loaded into the process. Individual objects can request that lazy
reference relocations are performed when the object is loaded.
See the -z now option of ld(1), and dlopen(3C) with the mode
RTLD_NOW. Such requests to perform lazy reference relocations are
suppressed when LD_BIND_LAZY is in effect.

If both LD_BIND_LAZY and LD_BIND_NOW are specified, then
LD_BIND_NOW takes precedence.


LD_BIND_NOW, LD_BIND_NOW_32, and LD_BIND_NOW_64

The runtime linker's default mode of performing lazy binding can
be overridden by setting the environment variable LD_BIND_NOW to
any non-null value. This setting causes the runtime linker to
perform both immediate reference and lazy reference relocations
for all objects that are loaded into the process. Individual
objects can request that lazy reference relocations are performed
when the object is loaded. See the -z now option of ld(1), and
dlopen(3C) with the mode RTLD_NOW.

If both LD_BIND_NOW and LD_BIND_LAZY are specified, then
LD_BIND_NOW takes precedence.


LD_CAP_FILES, LD_CAP_FILES_32, and LD_CAP_FILES_64

A comma-separated list of executables and shared libraries to
which the alternative capabilities specified by LD_MACHCAP,
LD_PLATCAP, LD_HWCAP and LD_SFCAP should apply.

Executables and libraries may be specified either by their SONAME
or their full real pathname.


LD_CONFIG, LD_CONFIG_32, and LD_CONFIG_64

Provides an alternative configuration file. Configuration files
can be employed to alter default search paths, provide a
directory cache, and provide alternate object dependencies. See
crle(1).


LD_DEBUG, LD_DEBUG_32, and LD_DEBUG_64

Provides a comma, or colon-separated list of tokens to cause the
runtime linker to print debugging information to standard error.
The special token help indicates the full list of tokens
available. The environment variable LD_DEBUG_OUTPUT can also be
supplied to specify a file to which the debugging information is
sent. The filename is suffixed with the process ID of the
application generating the debugging information. See lari(1).


LD_DEMANGLE, LD_DEMANGLE_32, and LD_DEMANGLE_64

Any symbol name used as part of a diagnostic message is shown as
defined within an ELF file. When LD_DEMANGLE is set to any non-
null value, the runtime linker attempts to decode (demangle) any
C++ symbol name.


LD_FLAGS, LD_FLAGS_32, and LD_FLAGS_64

Provides an alternative means of supplying environment variable
information. Any of the LD_XXX environment variables can be
specified as a xxx token. Multiple tokens can be supplied
separated by commas. See EXAMPLES.


LD_HWCAP, LD_HWCAP_32, and LD_HWCAP_64

Specify a comma-separated set of alternative hardware
capabilities. A leading '+' indicates that the capabilities
should be included in addition to the default set, a leading '-'
indicates that the capabilities should be excluded from the
default set, and neither indicates that the set should replace
the default set.

Capabilities may be specified either by name, or as hexadecimal
integers with an optional leading bracketed index number
specifying the capabilities family.
LD_HWCAP=[1]01 # Sets CA_SUN_HW_1 to 0x1
LD_HWCAP=[2]20 # Sets CA_SUN_HW_2 to 0x20


LD_MACHCAP

Specify an alternative machine hardware capability name.


LD_LIBRARY_PATH, LD_LIBRARY_PATH_32, and LD_LIBRARY_PATH_64

The LD_LIBRARY_PATH environment variable, if set, is used to
enhance the search path that the runtime linker uses to find
dynamic dependencies. LD_LIBRARY_PATH specifies a colon-
separated list of directories that are searched before the
default directories. Also notice that LD_LIBRARY_PATH adds
additional semantics to ld(1).


LD_LOADFLTR, LD_LOADFLTR_32, and LD_LOADFLTR_64

Filters are a form of shared object. Filters allow an alternative
shared object to be selected at runtime that provide the
implementation for any symbols that are defined within the
filter. See the -f and -F options of ld(1). By default, the
alternative shared object processing is deferred until symbol
resolution occurs against the filter. When LD_LOADFLTR is set to
any non-null value, any filters are processed immediately when
the filter is loaded. Also, see the -z loadfltr option of ld(1).


LD_NOAUDIT, LD_NOAUDIT_32, and LD_NOAUDIT_64

Local auditing libraries can be defined within applications and
shared objects. See the -p and -P options of ld(1). When
LD_NOAUDIT is set to any non-null value, the runtime linker
ignores any local auditing libraries.


LD_NOAUXFLTR, LD_NOAUXFLTR_32, and LD_NOAUXFLTR_64

Auxiliary filters are a form of shared object. Auxiliary filters
allow an alternative shared object to be selected at runtime
which provides the implementation for any symbols that are
defined within the filter. See the -f option of ld(1). When
LD_NOAUXFLTR is set to any non-null value, the runtime linker
disables this alternative shared object lookup.


LD_NOCONFIG, LD_NOCONFIG_32, and LD_NOCONFIG_64

By default the runtime linker attempts to open and process a
configuration file. When LD_NOCONFIG is set to any non-null
value, the runtime linker disables this configuration file
processing.


LD_NODIRCONFIG, LD_NODIRCONFIG_32, and LD_NODIRCONFIG_64

Provides a subset of LD_NOCONFIG in that any directory cache
information provided in a configuration file is ignored.


LD_NODIRECT, LD_NODIRECT_32, and LD_NODIRECT_64

Direct binding information instructs the runtime linker to search
directly for a symbol in an associated object. See the -B direct
option of ld(1). Without direct binding, the symbol search
performed by the runtime linker follows the default model. When
LD_NODIRECT is set to any non-null value, the runtime linker
ignores any direct binding information.


LD_NOENVCONFIG, LD_NOENVCONFIG_32, and LD_NOENVCONFIG_64

Provides a subset of LD_NOCONFIG in that any environment
variables provided in a configuration file are ignored.


LD_NOLAZYLOAD, LD_NOLAZYLOAD_32, and LD_NOLAZYLOAD_64

Dependencies that are labeled for lazy loading are not loaded
into memory until explicit reference to the dependency has been
made. See the -z lazyload option of ld(1). When LD_NOLAZYLOAD is
set to any non-null value, the runtime linker ignores a
dependencies lazy loading label and loads the dependency
immediately.


LD_NOOBJALTER, LD_NOOBJALTER_32, and LD_NOOBJALTER_64

Provides a subset of LD_NOCONFIG in that any alternative object
dependencies provided in a configuration file are ignored.


LD_NOVERSION, LD_NOVERSION_32, and LD_NOVERSION_64

By default, the runtime linker verifies version dependencies for
the primary executable and all of its dependencies. When
LD_NOVERSION is set to any non-null value, the runtime linker
disables this version checking.


LD_ORIGIN, LD_ORIGIN_32, and LD_ORIGIN_64

The immediate processing of $ORIGIN can be triggered by setting
the environment variable LD_ORIGIN to any non-null value. Before
Solaris 9, this option was useful for applications that invoked
chdir(2) prior to locating dependencies that employed the $ORIGIN
string token. The establishment of the current working directory
by the runtime linker is now default thus making this option
redundant.


LD_PLATCAP

Specify an alternative platform hardware capability name.


LD_PRELOAD, LD_PRELOAD_32, and LD_PRELOAD_64

Provides a list of shared objects, separated by spaces. These
objects are loaded after the program being executed but before
any other shared objects that the program references. Symbol
definitions provided by the preloaded objects interpose on
references made by the shared objects that the program
references. Symbol definitions provided by the preloaded objects
do not interpose on the symbol definitions provided by the
program.


LD_PROFILE, LD_PROFILE_32, and LD_PROFILE_64

Defines a shared object to be profiled by the runtime linker.
When profiling is enabled, a profiling buffer file is created and
mapped. The name of the buffer file is the name of the shared
object being profiled with a .profile extension. By default, this
buffer is placed under /var/tmp. The environment variable
LD_PROFILE_OUTPUT can also be supplied to indicate an alternative
directory in which to place the profiling buffer.

The profiling buffer contains profil(2) and call count
information. This information is similar to the gmon.out
information generated by programs that have been linked with the
-xpg option of cc. Any applications that use the named shared
object and run while this environment variable is set, accumulate
data in the profile buffer. See also NOTES. The profile buffer
information can be examined using gprof(1).

The LD_PROFILE profiling technique is an alternative to other
techniques that might be provided by the compilation system. The
shared object being profiled does not have to be instrumented in
any way, and LD_PROFILE should not be combined with a profile-
instrumented application. See the Linker and Libraries Guide for
more information on profiling shared objects.


LD_SFCAP, LD_SFCAP_32, and LD_SFCAP_64

Specify a comma-separated set of alternative software
capabilities. A leading '+' indicates that the capabilities
should be included in addition to the default set, a leading '-'
indicates that the capabilities should be excluded from the
default set, and neither indicates that the set should replace
the default set.

Capabilities may be specified either by name, or as hexadecimal
integers.


LD_SIGNAL, LD_SIGNAL_32, and LD_SIGNAL_64

Provides a numeric signal number that the runtime linker uses to
kill the process in the event of a fatal runtime error. See
thr_kill(3C). By default, SIGKILL is used. For example, providing
the alternative signal number 6 (SIGABRT), can provide for the
creation of a core file to aid debugging. See also the
RTLD_DI_SETSIGNAL request to dlinfo(3C).


Notice that environment variable names beginning with the characters
'LD_' are reserved for possible future enhancements to ld(1) and
ld.so.1.

SECURITY


Secure processes have some restrictions applied to the evaluation of
their dependencies and runpaths to prevent malicious dependency
substitution or symbol interposition.


The runtime linker categorizes a process as secure if the
issetugid(2) system call returns true for the process.


For 32-bit objects, the default trusted directories that are known to
the runtime linker are /lib/secure and /usr/lib/secure. For 64-bit
objects, the default trusted directories are /lib/secure/64 and
/usr/lib/secure/64. The utility crle(1) can be used to specify
additional trusted directories that are applicable for secure
applications. Administrators who use this technique should ensure
that the target directories are suitably protected from malicious
intrusion.


If an LD_LIBRARY_PATH family environment variable is in effect for a
secure process, only the trusted directories specified by this
variable are used to augment the runtime linker's search rules.


In a secure process, runpath components that are provided by the
application or any of its dependencies are used, provided the
component is a full path name, that is, the path name starts with a
'/'.


In a secure process, the expansion of the $ORIGIN string is allowed
only if the string expands to a trusted directory. However, should a
$ORIGIN expansion match a directory that has already provided
dependencies, then the directory is implicitly secure. This directory
can be used to provide additional dependencies.


In a secure process, LD_CONFIG is ignored. However, a configuration
file that is recorded in a secure application is used. See the -c
option of ld(1). A recorded configuration file must be a full path
name, that is, the path name starts with a '/'. A recorded
configuration file that employs the $ORIGIN string is restricted to
known trusted directories. Developers who record a configuration
file within a secure application should ensure that the configuration
file directory is suitably protected from malicious intrusion. In the
absence of a recorded configuration file, a secure process uses the
default configuration file, if a configuration file exists. See
crle(1).


In a secure process, LD_SIGNAL is ignored.


Additional objects can be loaded with a secure process using the
LD_PRELOAD, or LD_AUDIT environment variables. These objects must be
specified as full path names or simple file names. Full path names
are restricted to known trusted directories. Simple file names, in
which no '/' appears in the name, are located subject to the search
path restrictions previously described. Simple file names resolve
only to known trusted directories.


In a secure process, any dependencies that consist of simple
filenames are processed using the path name restrictions previously
described. Dependencies expressed as full path names or relative path
names are used as is. Therefore, the developer of a secure process
should ensure that the target directory referenced as a full path
name or relative path name dependency is suitably protected from
malicious intrusion.


When creating a secure process, relative path names should not be
used to express dependencies, or to construct dlopen(3C) path names.
This restriction should be applied to the application and to all
dependencies.

EXAMPLES


Example 1: Using LD_FLAGS to group environment variable information




The following use of LD_FLAGS is equivalent to setting the individual
environment variables LD_BIND_NOW and LD_LIBRARY_PATH for 32-bit
applications:


example% LD_FLAGS_32=bind_now,library_path=/lib/one:/lib/two


The following use of LD_FLAGS is equivalent to setting the individual
environment variables LD_LIBRARY_PATH and LD_PRELOAD for 64-bit
applications:


example% LD_FLAGS_64=library_path=/lib/one/64,preload=foo.so


FILES


/lib/ld.so.1

Default runtime linker.


/lib/libc.so.1

Alternate interpreter for SVID ABI compatibility.


/usr/lib/ld.so

AOUT (BCP) runtime linker.


/usr/lib/0@0.so.1

A compatibility library to support null character pointers. See
NOTES.


/lib/secure and /usr/lib/secure

LD_PRELOAD location for secure applications.


/lib/secure/64 and /usr/lib/secure/64

LD_PRELOAD location for secure 64-bit applications.


/lib/64/ld.so.1

Default runtime linker for 64-bit applications.


/usr/lib/64/0@0.so.1

A 64-bit compatibility library to support null character
pointers. See NOTES.


/var/ld/ld.config

Default configuration file for 32-bit applications.


/var/ld/64/ld.config

Default configuration file for 64-bit applications.


SEE ALSO


crle(1), gprof(1), lari(1), ld(1), ldd(1), exec(2), issetugid(2),
mmapobj(2), profil(2), dladdr(3C), dlclose(3C), dldump(3C),
dlerror(3C), dlinfo(3C), dlopen(3C), dlsym(3C), thr_kill(3C),
proc(5), attributes(7)


Linker and Libraries Guide

NOTES


Care should be exercised when using LD_PROFILE in combination with
other process monitoring techniques, such as users of proc(5).
Multiple process monitoring techniques can result in deadlock
conditions that leave the profile buffer locked. A locked buffer
blocks any processes that try to record profiling information. To
reduce this likelihood, the runtime linker's profile implementation
determines if the process is being monitored at startup. If so,
profiling of the process is silently disabled. However, this
mechanism can not catch monitoring processes that attach to the
process during its execution.


The user compatibility library /usr/lib/0@0.so.1 provides a mechanism
that establishes a value of 0 at location 0. Some applications exist
that erroneously assume a null character pointer should be treated
the same as a pointer to a null string. A segmentation violation
occurs in these applications when a null character pointer is
accessed. If this library is added to such an application at runtime
using LD_PRELOAD, the library provides an environment that is
sympathetic to this errant behavior. However, the user compatibility
library is intended neither to enable the generation of such
applications, nor to endorse this particular programming practice.


In many cases, the presence of /usr/lib/0@0.so.1 is benign, and it
can be pre-loaded into programs that do not require it. However,
there are exceptions. Some applications, such as the JVM (Java
Virtual Machine), require that a segmentation violation be generated
from a null pointer access. Applications such as the JVM should not
preload /usr/lib/0@0.so.

December 28, 2020 LD.SO.1(1)

tribblix@gmail.com :: GitHub :: Privacy