summaryrefslogtreecommitdiffstats
path: root/c_user/linker_sets.rst
diff options
context:
space:
mode:
Diffstat (limited to 'c_user/linker_sets.rst')
-rw-r--r--c_user/linker_sets.rst520
1 files changed, 0 insertions, 520 deletions
diff --git a/c_user/linker_sets.rst b/c_user/linker_sets.rst
deleted file mode 100644
index ad45fea..0000000
--- a/c_user/linker_sets.rst
+++ /dev/null
@@ -1,520 +0,0 @@
-.. comment SPDX-License-Identifier: CC-BY-SA-4.0
-
-.. COMMENT: COPYRIGHT (c) 1989-2014.
-.. COMMENT: On-Line Applications Research Corporation (OAR).
-.. COMMENT: All rights reserved.
-
-.. _Linker Sets:
-
-Linker Sets
-###########
-
-.. index:: linkersets
-
-Introduction
-============
-
-Linker sets are a flexible means to create arrays of items out of a set of
-object files at link-time. For example its possible to define an item *I* of
-type *T* in object file *A* and an item *J* of type *T* in object file *B* to
-be a member of a linker set *S*. The linker will then collect these two items
-*I* and *J* and place them in consecutive memory locations, so that they can be
-accessed like a normal array defined in one object file. The size of a linker
-set is defined by its begin and end markers. A linker set may be empty. It
-should only contain items of the same type.
-
-The following macros are provided to create, populate and use linker sets.
-
-- RTEMS_LINKER_SET_BEGIN_ - Designator of the linker set begin marker
-
-- RTEMS_LINKER_SET_END_ - Designator of the linker set end marker
-
-- RTEMS_LINKER_SET_SIZE_ - The linker set size in characters
-
-- RTEMS_LINKER_ROSET_DECLARE_ - Declares a read-only linker set
-
-- RTEMS_LINKER_ROSET_ - Defines a read-only linker set
-
-- RTEMS_LINKER_ROSET_ITEM_DECLARE_ - Declares a read-only linker set item
-
-- RTEMS_LINKER_ROSET_ITEM_REFERENCE_ - References a read-only linker set item
-
-- RTEMS_LINKER_ROSET_ITEM_ - Defines a read-only linker set item
-
-- RTEMS_LINKER_ROSET_ITEM_ORDERED_ - Defines an ordered read-only linker set item
-
-- RTEMS_LINKER_RWSET_DECLARE_ - Declares a read-write linker set
-
-- RTEMS_LINKER_RWSET_ - Defines a read-write linker set
-
-- RTEMS_LINKER_RWSET_ITEM_DECLARE_ - Declares a read-write linker set item
-
-- RTEMS_LINKER_RWSET_ITEM_REFERENCE_ - References a read-write linker set item
-
-- RTEMS_LINKER_RWSET_ITEM_ - Defines a read-write linker set item
-
-- RTEMS_LINKER_RWSET_ITEM_ORDERED_ - Defines an ordered read-write linker set item
-
-Background
-==========
-
-Linker sets are used not only in RTEMS, but also for example in Linux, in
-FreeBSD, for the GNU C constructor extension and for global C++ constructors.
-They provide a space efficient and flexible means to initialize modules. A
-linker set consists of
-
-- dedicated input sections for the linker (e.g. ``.ctors`` and ``.ctors.*`` in
- the case of global constructors),
-
-- a begin marker (e.g. provided by ``crtbegin.o``, and
-
-- an end marker (e.g. provided by ``ctrend.o``).
-
-A module may place a certain data item into the dedicated input section. The
-linker will collect all such data items in this section and creates a begin and
-end marker. The initialization code can then use the begin and end markers to
-find all the collected data items (e.g. pointers to initialization functions).
-
-In the linker command file of the GNU linker we need the following output
-section descriptions.
-
-.. code-block:: c
-
- /* To be placed in a read-only memory region */
- .rtemsroset : {
- KEEP (*(SORT(.rtemsroset.*)))
- }
- /* To be placed in a read-write memory region */
- .rtemsrwset : {
- KEEP (*(SORT(.rtemsrwset.*)))
- }
-
-The ``KEEP()`` ensures that a garbage collection by the linker will not discard
-the content of this section. This would normally be the case since the linker
-set items are not referenced directly. The ``SORT()`` directive sorts the
-input sections lexicographically. Please note the lexicographical order of the
-``.begin``, ``.content`` and ``.end`` section name parts in the RTEMS linker
-sets macros which ensures that the position of the begin and end markers are
-right.
-
-So, what is the benefit of using linker sets to initialize modules? It can be
-used to initialize and include only those RTEMS managers and other components
-which are used by the application. For example, in case an application uses
-message queues, it must call ``rtems_message_queue_create()``. In the module
-implementing this function, we can place a linker set item and register the
-message queue handler constructor. Otherwise, in case the application does not
-use message queues, there will be no reference to the
-``rtems_message_queue_create()`` function and the constructor is not
-registered, thus nothing of the message queue handler will be in the final
-executable.
-
-For an example see test program :file:`sptests/splinkersets01`.
-
-Directives
-==========
-
-.. _RTEMS_LINKER_SET_BEGIN:
-
-RTEMS_LINKER_SET_BEGIN - Designator of the linker set begin marker
-------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_SET_BEGIN
-
-.. code-block:: c
-
- volatile type *begin = RTEMS_LINKER_SET_BEGIN( set );
-
-**DESCRIPTION:**
-
-This macro generates the designator of the begin marker of the linker set
-identified by ``set``. The item at the begin marker address is the first
-member of the linker set if it exists, e.g. the linker set is not empty. A
-linker set is empty, if and only if the begin and end markers have the same
-address.
-
-The ``set`` parameter itself must be a valid C designator on which no macro
-expansion is performed. It uniquely identifies the linker set.
-
-.. _RTEMS_LINKER_SET_END:
-
-RTEMS_LINKER_SET_END - Designator of the linker set end marker
---------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_SET_END
-
-.. code-block:: c
-
- volatile type *end = RTEMS_LINKER_SET_END( set );
-
-**DESCRIPTION:**
-
-This macro generates the designator of the end marker of the linker set
-identified by ``set``. The item at the end marker address is not a member of
-the linker set. The ``set`` parameter itself must be a valid C designator on
-which no macro expansion is performed. It uniquely identifies the linker set.
-
-.. _RTEMS_LINKER_SET_SIZE:
-
-RTEMS_LINKER_SET_SIZE - The linker set size in characters
----------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_SET_SIZE
-
-.. code-block:: c
-
- size_t size = RTEMS_LINKER_SET_SIZE( set );
-
-**DESCRIPTION:**
-
-This macro returns the size of the linker set identified by ``set`` in
-characters. The ``set`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies the linker set.
-
-.. _RTEMS_LINKER_ROSET_DECLARE:
-
-RTEMS_LINKER_ROSET_DECLARE - Declares a read-only linker set
-------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_ROSET_DECLARE
-
-.. code-block:: c
-
- RTEMS_LINKER_ROSET_DECLARE( set, type );
-
-**DESCRIPTION:**
-
-This macro generates declarations for the begin and end markers of a read-only
-linker set identified by ``set``. The ``set`` parameter itself must be a valid
-C designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set.
-
-.. _RTEMS_LINKER_ROSET:
-
-RTEMS_LINKER_ROSET - Defines a read-only linker set
----------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_ROSET
-
-.. code-block:: c
-
- RTEMS_LINKER_ROSET( set, type );
-
-**DESCRIPTION:**
-
-This macro generates definitions for the begin and end markers of a read-only
-linker set identified by ``set``. The ``set`` parameter itself must be a valid
-C designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set.
-
-.. _RTEMS_LINKER_ROSET_ITEM_DECLARE:
-
-RTEMS_LINKER_ROSET_ITEM_DECLARE - Declares a read-only linker set item
-----------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_ROSET_ITEM_DECLARE
-
-.. code-block:: c
-
- RTEMS_LINKER_ROSET_ITEM_DECLARE( set, type, item );
-
-**DESCRIPTION:**
-
-This macro generates a declaration of an item contained in the read-only linker
-set identified by ``set``. The ``set`` parameter itself must be a valid C
-designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies an item in the linker
-set.
-
-.. _RTEMS_LINKER_ROSET_ITEM_REFERENCE:
-
-RTEMS_LINKER_ROSET_ITEM_REFERENCE - References a read-only linker set item
---------------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_ROSET_ITEM_REFERENCE
-
-.. code-block:: c
-
- RTEMS_LINKER_ROSET_ITEM_REFERENCE( set, type, item );
-
-**DESCRIPTION:**
-
-This macro generates a reference to an item contained in the read-only linker
-set identified by ``set``. The ``set`` parameter itself must be a valid C
-designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies an item in the linker
-set.
-
-.. _RTEMS_LINKER_ROSET_ITEM:
-
-RTEMS_LINKER_ROSET_ITEM - Defines a read-only linker set item
--------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_ROSET_ITEM
-
-.. code-block:: c
-
- RTEMS_LINKER_ROSET_ITEM( set, type, item );
-
-**DESCRIPTION:**
-
-This macro generates a definition of an item contained in the read-only linker
-set identified by ``set``. The ``set`` parameter itself must be a valid C
-designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies an item in the linker
-set.
-
-.. _RTEMS_LINKER_ROSET_ITEM_ORDERED:
-
-RTEMS_LINKER_ROSET_ITEM_ORDERED - Defines an ordered read-only linker set item
-------------------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_ROSET_ITEM_ORDERED
-
-.. code-block:: c
-
- RTEMS_LINKER_ROSET_ITEM_ORDERED( set, type, item, order );
-
-**DESCRIPTION:**
-
-This macro generates a definition of an ordered item contained in the read-only
-linker set identified by ``set``. The ``set`` parameter itself must be a valid
-C designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on
-which no macro expansion is performed. It uniquely identifies an item in the
-linker set. The ``order`` parameter must be a valid linker input section name
-part on which macro expansion is performed. The items are lexicographically
-ordered according to the ``order`` parameter within a linker set. Ordered
-items are placed before unordered items in the linker set.
-
-**NOTES:**
-
-To be resilient to typos in the order parameter, it is recommended to use the
-following construct in macros defining items for a particular linker set (see
-enum in ``XYZ_ITEM()``).
-
-.. code-block:: c
-
- #include <rtems/linkersets.h>
-
- typedef struct {
- int foo;
- } xyz_item;
-
- /* The XYZ-order defines */
- #define XYZ_ORDER_FIRST 0x00001000
- #define XYZ_ORDER_AND_SO_ON 0x00002000
-
- /* Defines an ordered XYZ-item */
- #define XYZ_ITEM( item, order ) \
- enum { xyz_##item = order - order }; \
- RTEMS_LINKER_ROSET_ITEM_ORDERED( \
- xyz, const xyz_item *, item, order \
- ) = { &item }
-
- /* Example item */
- static const xyz_item some_item = { 123 };
- XYZ_ITEM( some_item, XYZ_ORDER_FIRST );
-
-.. _RTEMS_LINKER_RWSET_DECLARE:
-
-RTEMS_LINKER_RWSET_DECLARE - Declares a read-write linker set
--------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_RWSET_DECLARE
-
-.. code-block:: c
-
- RTEMS_LINKER_RWSET_DECLARE( set, type );
-
-**DESCRIPTION:**
-
-This macro generates declarations for the begin and end markers of a read-write
-linker set identified by ``set``. The ``set`` parameter itself must be a valid
-C designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set.
-
-.. _RTEMS_LINKER_RWSET:
-
-RTEMS_LINKER_RWSET - Defines a read-write linker set
-----------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_RWSET
-
-.. code-block:: c
-
- RTEMS_LINKER_RWSET( set, type );
-
-**DESCRIPTION:**
-
-This macro generates definitions for the begin and end markers of a read-write
-linker set identified by ``set``. The ``set`` parameter itself must be a valid
-C designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set.
-
-.. _RTEMS_LINKER_RWSET_ITEM_DECLARE:
-
-RTEMS_LINKER_RWSET_ITEM_DECLARE - Declares a read-write linker set item
------------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_RWSET_ITEM_DECLARE
-
-.. code-block:: c
-
- RTEMS_LINKER_RWSET_ITEM_DECLARE( set, type, item );
-
-**DESCRIPTION:**
-
-This macro generates a declaration of an item contained in the read-write
-linker set identified by ``set``. The ``set`` parameter itself must be a valid
-C designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies an item in the linker
-set.
-
-.. _RTEMS_LINKER_RWSET_ITEM_REFERENCE:
-
-RTEMS_LINKER_RWSET_ITEM_REFERENCE - References a read-write linker set item
----------------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_RWSET_ITEM_REFERENCE
-
-.. code-block:: c
-
- RTEMS_LINKER_RWSET_ITEM_REFERENCE( set, type, item );
-
-**DESCRIPTION:**
-
-This macro generates a reference to an item contained in the read-write linker
-set identified by ``set``. The ``set`` parameter itself must be a valid C
-designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies an item in the linker
-set.
-
-.. _RTEMS_LINKER_RWSET_ITEM:
-
-RTEMS_LINKER_RWSET_ITEM - Defines a read-write linker set item
---------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_RWSET_ITEM
-
-.. code-block:: c
-
- RTEMS_LINKER_RWSET_ITEM( set, type, item );
-
-**DESCRIPTION:**
-
-This macro generates a definition of an item contained in the read-write linker
-set identified by ``set``. The ``set`` parameter itself must be a valid C
-designator on which no macro expansion is performed. It uniquely identifies
-the linker set. The ``type`` parameter defines the type of the linker set
-items. The type must be the same for all macro invocations of a particular
-linker set. The ``item`` parameter itself must be a valid C designator on which
-no macro expansion is performed. It uniquely identifies an item in the linker
-set.
-
-.. _RTEMS_LINKER_RWSET_ITEM_ORDERED:
-
-RTEMS_LINKER_RWSET_ITEM_ORDERED - Defines an ordered read-write linker set item
--------------------------------------------------------------------------------
-
-**CALLING SEQUENCE:**
-
-.. index:: RTEMS_LINKER_RWSET_ITEM_ORDERED
-
-.. code-block:: c
-
- RTEMS_LINKER_RWSET_ITEM_ORDERED( set, type, item, order );
-
-**DESCRIPTION:**
-
-This macro generates a definition of an ordered item contained in the
-read-write linker set identified by ``set``. The ``set`` parameter itself must
-be a valid C designator on which no macro expansion is performed. It uniquely
-identifies the linker set. The ``type`` parameter defines the type of the
-linker set items. The type must be the same for all macro invocations of a
-particular linker set. The ``item`` parameter itself must be a valid C
-designator on which no macro expansion is performed. It uniquely identifies an
-item in the linker set. The ``order`` parameter must be a valid linker input
-section name part on which macro expansion is performed. The items are
-lexicographically ordered according to the ``order`` parameter within a linker
-set. Ordered items are placed before unordered items in the linker set.
-
-**NOTES:**
-
-To be resilient to typos in the order parameter, it is recommended to use the
-following construct in macros defining items for a particular linker set (see
-enum in ``XYZ_ITEM()``).
-
-.. code-block:: c
-
- #include <rtems/linkersets.h>
-
- typedef struct {
- int foo;
- } xyz_item;
-
- /* The XYZ-order defines */
- #define XYZ_ORDER_FIRST 0x00001000
- #define XYZ_ORDER_AND_SO_ON 0x00002000
-
- /* Defines an ordered XYZ-item */
- #define XYZ_ITEM( item, order ) \
- enum { xyz_##item = order - order }; \
- RTEMS_LINKER_RWSET_ITEM_ORDERED( \
- xyz, const xyz_item *, item, order \
- ) = { &item }
- /* Example item */
- static const xyz_item some_item = { 123 };
- XYZ_ITEM( some_item, XYZ_ORDER_FIRST );