blob: e86fa74b08fcd1cee8ac1d7ca6ba06265499f16e [file] [log] [blame] [edit]
.. _module-pw_build-linker_scripts:
==============
Linker Scripts
==============
.. pigweed-module-subpage::
:name: pw_build
``pw_build`` provides utilities for working with linker scripts in embedded
projects. If using the ``GN`` or ``Bazel`` build systems you can preprocess your
linker script using the C preprocessor with the ``pw_linker_script`` rules.
- GN :ref:`module-pw_build-gn-pw_linker_script`
- Bazel :ref:`module-pw_build-bazel-pw_linker_script`
---------------------
Linker Script Helpers
---------------------
``PW_MUST_PLACE``
=================
.. doxygengroup:: pw_must_place
:content-only:
:members:
``LinkerSymbol``
================
.. doxygenclass:: pw::LinkerSymbol
:members:
.. note::
``LinkerSymbol`` does not support, and is not necessary for, symbols that
communicate a pointer value (i.e. an address). For those, simply define an
extern variable of the pointed-to type, e.g.:
.. code-block:: cpp
extern "C" uint32_t PTR_SYM;
``LinkerSymbol`` is superior to the traditional ``extern uint8_t FOO;``
``(uint32_t)&FOO`` method because it catches subtle errors:
* Missing ``extern`` specifier:
.. code-block:: none
error: use of deleted function 'pw::build::LinkerSymbol::LinkerSymbol()'
| LinkerSymbol oops;
| ^~~~
* Missing ``&`` operator:
.. code-block:: none
error: invalid cast from type 'pw::build::LinkerSymbol' to type 'uint32_t' {aka 'long unsigned int'}
| uint32_t val = (uint32_t)FOO_SYM;
| ^~~~~~~~~~~~~~~~~