Next: , Previous: Pragma Linker_Destructor, Up: Implementation Defined Pragmas


Pragma Linker_Section

Syntax:

     pragma Linker_Section (
       [Entity  =>] local_NAME
       [Section =>] static_string_EXPRESSION);

local_NAME must refer to an object that is declared at the library level. This pragma specifies the name of the linker section for the given entity. It is equivalent to __attribute__((section)) in GNU C and causes local_NAME to be placed in the static_string_EXPRESSION section of the executable (assuming the linker doesn't rename the section).

The compiler normally places library-level objects in standard sections depending on their type: procedures and functions generally go in the .text section, initialized variables in the .data section and uninitialized variables in the .bss section.

Other, special sections may exist on given target machines to map special hardware, for example I/O ports or flash memory. This pragma is a means to defer the final layout of the executable to the linker, thus fully working at the symbolic level with the compiler.

Some file formats do not support arbitrary sections so not all target machines support this pragma. The use of this pragma may cause a program execution to be erroneous if it is used to place an entity into an inappropriate section (e.g. a modified variable into the .text section). See also pragma Persistent_BSS.

     --  Example of the use of pragma Linker_Section
     
     package IO_Card is
       Port_A : Integer;
       pragma Volatile (Port_A);
       pragma Linker_Section (Port_A, ".bss.port_a");
     
       Port_B : Integer;
       pragma Volatile (Port_B);
       pragma Linker_Section (Port_B, ".bss.port_b");
     end IO_Card;