Code And Data Relocation¶
This feature will allow relocating .text, .rodata, .data, and .bss sections from required files and place them in the required memory region. The memory region and file are given to the scripts/gen_relocate_app.py script in the form of a string. This script is always invoked from inside cmake.
This script provides a robust way to re-order the memory contents without
actually having to modify the code. In simple terms this script will do the job
__attribute__((section("name"))) for a bunch of files together.
The memory region and file are given to the scripts/gen_relocate_app.py script in the form of a string.
An example of such a string is:
This script is invoked with the following parameters:
python3 gen_relocate_app.py -i input_string -o generated_linker -c generated_code
CONFIG_CODE_DATA_RELOCATION option, when enabled in
prj.conf, will invoke the script and do the required relocation.
This script also trigger the generation of
code_relocation.c files. The
linker_relocate.ld file creates
appropriate sections and links the required functions or variables from all the
The text section is split into 2 parts in the main linker script. The first section will have some info regarding vector tables and other debug related info. The second section will have the complete text section. This is needed to force the required functions and data variables to the correct locations. This is due to the behavior of the linker. The linker will only link once and hence this text section had to be split to make room for the generated linker script.
code_relocation.c file has code that is needed for
initializing data sections, and a copy of the text sections (if XIP).
Also this contains code needed for bss zeroing and
for data copy operations from ROM to required memory type.
The procedure to invoke this feature is:
CMakeLists.txtfile in the project, mention all the files that need relocation.
Where the first argument is the file/files and the second argument is the memory where it must be placed.
The file argument supports limited regular expressions. function zephyr_code_relocate() can be called as many times as required. This step has to be performed before the inclusion of boilerplate.cmake.
This section shows additional configuration options that can be set in
if the memory is SRAM1, SRAM2, CCD, or AON, then place the full object in the sections for example:
zephyr_code_relocate(src/file1.c SRAM2) zephyr_code_relocate(src/file2.c.c SRAM)
if the memory type is appended with _DATA, _TEXT, _RODATA or _BSS, only the selected memory is placed in the required memory region. for example:
zephyr_code_relocate(src/file1.c SRAM2_DATA) zephyr_code_relocate(src/file2.c.c SRAM2_TEXT)
Multiple regions can also be appended together such as: SRAM2_DATA_BSS. This will place data and bss inside SRAM2.
NOCOPY option is passed to the
the relocation code is not generated in
code_relocation.c. This flag can be
used when we want to move the content of a specific file (or set of files) to a
This example will place the .text section of the
EXTFLASH memory region where it will be executed from (XIP). The
.data will be relocated as usual into SRAM.
zephyr_code_relocate(src/xip_external_flash.c EXTFLASH_TEXT NOCOPY) zephyr_code_relocate(src/xip_external_flash.c SRAM_DATA)
A sample showcasing this feature is provided at
This is an example of using the code relocation feature.
This example will place .text, .data, .bss from 3 files to various parts in the SRAM
using a custom linker file derived from
A sample showcasing the NOCOPY flag is provided at