Keil Logo Arm Logo

Technical Support

On-Line Manuals

Linker User Guide

Conventions and feedback Overview of the linker Linking models supported by armlink Image structure and generation Using linker optimizations Getting information about images Accessing and managing symbols with armlink Using scatter files About scatter-loading When to use scatter-loading Scatter-loading command-line option Images with a simple memory map Images with a complex memory map Linker-defined symbols that are not defined when s Specifying stack and heap using the scatter file What is a root region? Creating root execution regions Using the FIXED attribute to create root regions Placing functions and data at specific addresses Placing a named section explicitly using scatter-l Placing unassigned sections with the .ANY module s Examples of using placement algorithms for .ANY se Example of next_fit algorithm showing behavior of Examples of using sorting algorithms for .ANY sect Selecting veneer input sections in scatter-loading Using __attribute__((section("name"))) t Using __at sections to place sections at a specifi Restrictions on placing __at sections Automatic placement of __at sections Manual placement of __at sections Placing a key in flash memory using __at Placing a structure over a peripheral register usi Placement of sections with overlays About placing ARM C and C++ library code Example of placing code in a root region Example of placing ARM C library code Example of placing ARM C++ library code Example of placing ARM library helper functions Reserving an empty region About creating regions on page boundaries Overalignment of execution regions and input secti Using preprocessing commands in a scatter file Expression evaluation in scatter files Using expression evaluation in a scatter file to a Equivalent scatter-loading descriptions for simple Type 1 image, one load region and contiguous execu Type 2 image, one load region and non-contiguous e Type 3 image, two load regions and non-contiguous Scatter file to ELF mapping

Linker User Guide

Using __attribute__((section("name"))) to place code and data

Using __attribute__((section("name"))) to place code and data

You can place code and data by separating them into their own objects without having to use toolchain-specific pragmas or attributes. However, you can also use __attribute__((section("name"))) to place an item in a separate ELF section. You can then use a scatter file to place the named sections at specific locations.

To use __attribute__((section("name"))) to place a variable in a separate section:

  1. Use __attribute__((section("name"))) to specify the named section where the variable is to be placed, for example:

    Example 17. Naming a section

    int variable __attribute__((section("foo"))) = 10;
    

  2. Use a scatter file to place the named section, for example:

    Example 18. Placing a section

    FLASH 0x24000000 0x4000000
    {
        ...                                ; rest of code
    
        ADDER 0x08000000
        {
            file.o (foo)                  ; select section foo from file.o
        }
    }
    

The following example shows the memory map for the FLASH load region:

...
  Load Region FLASH (Base: 0x24000000, Size: 0x00000004, Max: 0x04000000, ABSOLUTE)

    Execution Region ADDER (Base: 0x08000000, Size: 0x00000004, Max: 0xffffffff, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x08000000   0x00000004   Data   RW           16    foo                 file.o
...

Be aware of the following:

  • linking with --autoat or --no_autoat does not affect the placement

  • if scatter-loading is not used, the section is placed in the default ER_RW execution region of the LR_1 load region

  • if you have a scatter file that does not include the foo selector, then the section is placed in the defined RW execution region.

You can also place a function at a specific address using .ARM.__at_address as the section name. For example, to place the function sqr at 0x20000, specify:

int sqr(int n1) __attribute__((section(".ARM.__at_0x20000")));

int sqr(int n1)
{
    return n1*n1;
}
Copyright © 2007-2008, 2011-2012 ARM. All rights reserved.ARM DUI 0377D
Non-ConfidentialID062912

Keil logo

Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.