Symbol Visibility
Symbols can be categorized as local or global. Local symbols can not be referenced from an object other than the object that contains the symbol definition. By default, local symbols are copied from any input relocatable object files to the output object being built. Local symbols can instead be eliminated from the output object. See Symbol Elimination.
Global symbols can be referenced from other objects besides the object
that contains the symbol definition. After collection and
resolution, global symbols are added to the symbol tables being
created in the output object. Although all global symbols are
processed and resolved together, their final visibility can be
adjusted. Global symbols can define additional visibility
attributes. See ELF Symbol Visibility. In addition,
mapfile
symbol directives can be used
to assign symbol visibilities during a link-edit. See Symbol Scope Types. These
visibility attributes, and directives, can result in a global symbol
having its visibility adjusted when written to the output
object.
When creating a relocatable object, all visibility attributes and
directives are recorded in the output object. However, the
visibility changes implied by these attributes are not applied. Any
visibility processing is instead deferred to a subsequent link-edit
of a dynamic object that reads these objects as input. In special
cases, the -B reduce
option can be used to
force the immediate interpretation of any visibility attributes or
directives.
When creating a dynamic object, symbol visibility attributes and directives are applied before the symbols are written to any symbol tables. Visibility attributes can ensure that symbols remain global, and are not affected by any symbol reduction techniques. Visibility attributes and directives can also result in global symbols being demoted to local. This latter technique is most frequently used to explicitly define an objects exported interface. See Reducing Symbol Scope.