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 ’:

       .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.