You copied the Doc URL to your clipboard.

Placing functions and data at specific addresses

To place a single function or data item at a fixed address, you must enable the linker to process the function or data separately from the rest of the input files.

Where they are required, the compiler normally produces RO, RW, and ZI sections from a single source file. These sections contain all the code and data from the source file.


For images targeted at Armv7‑M or Armv8‑M, the compiler might generate execute-only (XO) sections.

Typically, you create a scatter file that defines an execution region at the required address with a section description that selects only one section.

To place a function or variable at a specific address, it must be placed in its own section. There are several ways to do this:

  • By default, the compiler places each function and variable in individual ELF sections. This can be overridden using the -fno-function-sections or -fno-data-sections compiler options.
  • Place the function or data item in its own source file.
  • Use __attribute__((section("name"))) to place functions and variables in a specially named section, .ARM.__at_address, where address is the address to place the function or variable. For example, __attribute__((section(".ARM.__at_0x4000"))).

    To place ZI data at a specific address, use the variable attribute __attribute__((section("name"))) with the special name .bss.ARM.__at_address

    These specially named sections are called __at sections.

  • Use the .section directive from assembly language. In assembly code, the smallest locatable unit is a .section.

This section contains the following subsections: