|
| 1 | +/* |
| 2 | + * This script extends the default linker script to add a .noinit |
| 3 | + * section. This section is just mapped to RAM, but it is emitted |
| 4 | + * separately from the .data and .bss sections (both of which are |
| 5 | + * initialized by startup code), so any variables in this section are |
| 6 | + * untouched on startup (so they survive across resets). |
| 7 | + * |
| 8 | + * This script is intended to supplied to the linker's -T / --script |
| 9 | + * option as the primary linker script. When the linker sees an INSERT |
| 10 | + * command, this will cause it to *also* read the default linker script |
| 11 | + * (after reading this script) and then executing the INSERT commands |
| 12 | + * after both scripts have been read. |
| 13 | + * |
| 14 | + * Note that parsing of linker scripts is a bit peculiar, e.g. INSERT |
| 15 | + * does not textually inserts, it inserts any generated output sections. |
| 16 | + * Also, because this script is read *first*, we cannot refer to things |
| 17 | + * in the default script. In particular, it would make sense to add > |
| 18 | + * RAM to the output section below to ensure that the section is mapped |
| 19 | + * into RAM, but the RAM region is not defined yet (I think it would |
| 20 | + * work though, but produces warnings). Instead, we just rely on the |
| 21 | + * defaults used by the linker: If no region is defined for an output |
| 22 | + * section, it will just map to first address after the previous section |
| 23 | + * (.bss in this case, which is fine). |
| 24 | + */ |
| 25 | +SECTIONS |
| 26 | +{ |
| 27 | + /* Define a noinit output section and mark it as NOLOAD to prevent |
| 28 | + * putting its contents into the resulting .bin file (which is the |
| 29 | + * default). */ |
| 30 | + .noinit (NOLOAD) : |
| 31 | + { |
| 32 | + /* Ensure output is aligned */ |
| 33 | + . = ALIGN(4); |
| 34 | + /* Define a global _snoinit (and _enoinit below) symbol just in case |
| 35 | + * code wants to iterate over all noinit variables for some reason */ |
| 36 | + _snoinit = .; |
| 37 | + /* Actually import the .noinit and .noinit* import sections */ |
| 38 | + *(.noinit) |
| 39 | + *(.noinit*) |
| 40 | + . = ALIGN(4); |
| 41 | + _enoinit = .; |
| 42 | + } |
| 43 | +} |
| 44 | +INSERT AFTER .bss; |
0 commit comments