| |||
| Home > Using scatter files > Automatic placement of __at sections | |||
The automatic placement of __at sections
is enabled by default. This feature is controlled by the linker
command-line option, --autoat.
You cannot use __at section placement with
position independent execution regions.
When linking with the --autoat option, the __at sections
are not placed by the scatter-loading selectors. Instead, the linker
places the __at section in a compatible region.
If no compatible region is found, the linker creates a load and
execution region for the __at section.
All linker --autoat created execution regions
have the UNINIT scatter-loading attribute. If
you require a ZI __at section to be zero-initialized
then it must be placed within a compatible region. A linker --autoat created
execution region must have a base address that is at least 4 byte-aligned.
The linker produces an error message if any region is incorrectly
aligned.
A compatible region is one where:
The __at address
lies within the execution region base and limit, where limit is
the base address + maximum size of execution region. If no maximum
size is set, the linker sets the limit for placing __at sections
as the current size of the execution region without __at sections
plus a constant, 10240 bytes.
The execution region meets at least one of the following conditions:
it has a selector that
matches the __at section by the standard scatter-loading
rules
it has at least one section of the same type (RO,
RW or ZI) as the __at section
it does not have the EMPTY attribute.
The linker considers an __at section
with type RW compatible with RO.
The following example shows the sections .ARM.__at_0x0 type
RO, .ARM.__at_0x2000 type RW, .ARM.__at_0x4000 type
ZI, and .ARM.__at_0x8000 type ZI:
Example 20. Placement of the variables in C or C++ code
// place the RW variable in a section called.ARM.__at_0x2000int foo __attribute__((section(".ARM.__at_0x2000"))) = 100; // place the ZI variable in a section called.ARM.__at_0x4000int bar __attribute__((section(".ARM.__at_0x4000"), zero_init)); // place the ZI variable in a section called.ARM.__at_0x8000int variable __attribute__((section(".ARM.__at_0x8000"), zero_init));
Example 21. Automatic placement of __at sections
LR1 0x0
{
ER_RO 0x0 0x2000
{
*(+RO) ; .ARM.__at_0x0 lies within the bounds of ER_RO
}
ER_RW 0x2000 0x2000
{
*(+RW) ; .ARM.__at_0x2000 lies within the bounds of ER_RW
}
ER_ZI 0x4000 0x2000
{
*(+ZI) ; .ARM.__at_0x4000 lies within the bounds of ER_ZI
}
}
; the linker creates a load and execution region for the __at section
; .ARM.__at_0x8000 because it lies outside all candidate regions.
Linker Reference: