Weak Symbols
Historically, weak symbols have been used to circumvent interposition, or test for optional functionality. However, experience has shown that weak symbols are fragile and unreliable in modern programming environments, and their use is discouraged.
Weak symbol aliases were frequently employed within system shared objects. The intent was to provide an alternative interface name, typically the symbol name with a prefixed "_" character. This alias name could be referenced from other system shared objects to avoid interposition issues due to an application exporting their own implementation of the symbol name. In practice, this technique proved to be overly complex and was used inconsistently. Modern versions of Oracle Solaris establish explicit bindings between system objects with direct bindings. See Direct Bindings.
Weak symbol references were often employed to
test for the existence of an interface at runtime. This
technique places restrictions on the build environment, the
runtime environment, and can be circumvented by compiler
optimizations. The use of
dlsym
(3C) with the
RTLD_DEFAULT
, or
RTLD_PROBE
handles, provides a
consistent and robust means of testing for a symbol's
existence. See Testing for Functionality.