Next: PROVIDE_HIDDEN, Previous: HIDDEN, Up: Assignments [Contents][Index]

#### 3.5.3 PROVIDE

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.