In some cases, it is desirable for a linker script to define a symbol
only if it is referenced and is not defined by any object included in
the link. For example, traditional linkers defined the symbol
‘etext’. However, ANSI C requires that the user be able to use
‘etext’ as a function name without encountering an error. The
PROVIDE
keyword may be used to define a symbol, such as
‘etext’, only if it is referenced but not defined. The syntax is
PROVIDE(
symbol =
expression)
.
Here is an example of using PROVIDE
to define ‘etext’:
SECTIONS { .text : { *(.text) _etext = .; PROVIDE(etext = .); } }
In this example, if the program defines ‘_etext’ (with a leading underscore), the linker will give a multiple definition error. If, on the other hand, the program defines ‘etext’ (with no leading underscore), the linker will silently use the definition in the program. If the program references ‘etext’ but does not define it, the linker will use the definition in the linker script.
Note - the PROVIDE
directive considers a common symbol to be
defined, even though such a symbol could be combined with the symbol
that the PROVIDE
would create. This is particularly important
when considering constructor and destructor list symbols such as
‘__CTOR_LIST__’ as these are often defined as common symbols.