From 04c739116273500938f67f736a61131e453c6510 Mon Sep 17 00:00:00 2001 From: Ludovic Vanasse Date: Sat, 28 Dec 2024 19:40:59 -0500 Subject: [PATCH] Doc: loading ELF program Migrate the Updating a release System with ELF programs with child pages to official wiki --- Documentation/guides/fully_linked_elf.rst | 533 ++++++++++++++++++ .../system_arch_stm32f303xBC_and_f358xC.png | Bin 0 -> 16782 bytes .../system_arch_stm32f42xx_and_f43xx.png | Bin 0 -> 69449 bytes Documentation/guides/index.rst | 5 +- Documentation/guides/partially_linked_elf.rst | 429 ++++++++++++++ .../guides/updating_release_system_elf.rst | 25 + 6 files changed, 991 insertions(+), 1 deletion(-) create mode 100644 Documentation/guides/fully_linked_elf.rst create mode 100644 Documentation/guides/image/system_arch_stm32f303xBC_and_f358xC.png create mode 100644 Documentation/guides/image/system_arch_stm32f42xx_and_f43xx.png create mode 100644 Documentation/guides/partially_linked_elf.rst create mode 100644 Documentation/guides/updating_release_system_elf.rst diff --git a/Documentation/guides/fully_linked_elf.rst b/Documentation/guides/fully_linked_elf.rst new file mode 100644 index 0000000000..69e3d2b715 --- /dev/null +++ b/Documentation/guides/fully_linked_elf.rst @@ -0,0 +1,533 @@ +ELF Programs – No Symbol Tables +=============================== + +You can easily extend the firmware in your released, embedded system using ELF +programs provided via a file system (for example, an SD card or downloaded into +on-board SPI FLASH). In order to support such post-release updates, your +released firmware would have to support execution of fully linked, relocatable +ELF programs loaded into RAM (see, for example, ``apps/examples/elf``). + +The files shown in this Wiki page can be downloaded `here `_. + +Alan Carvalho de Assis has also made a video based on this example in the +YouTube `NuttX Channel `_. + +Creating the Export Package +--------------------------- + +At the time that you release the firmware, you should create and save an +export package. The export package is all that you need to create +post-release, add-on modules for your embedded system. Let's illustrate this +using the ``STM32F4-Discovery`` networking ``NSH`` configuration with the +``STM32F4DIS-BB`` baseboard. (This demonstration assumes that you also have +support for some externally modifiable media in the board configuration, such +as removable media like an SD card, or a USB FLASH stick, an internal file +system remotely accessible via USB MSC, FTP, or any remote file system (NFS). +The networking ``NSH`` configuration uses the SD card on the STM32 baseboard +for this demonstration. Other ``NSH`` configurations could be used, provided +that you supply the necessary file system support in some fashion.) + +(No baseboard? You can add file system support to the basic ``STM32F4-Discovery`` +board by following these instructions: +`USB FLASH drive `_ +or `SD card `_.) + +.. code-block:: shell + + $ make distclean + $ tools/configure.sh -c stm32f4discovery:netnsh + $ make menuconfig + +Your released firmware would have to have been built with a few important +configuration settings: + +1. Disable networking (Only because it is not needed in this example): + +.. code-block:: shell + + # CONFIG_NET is not set + +2. Enable basic ELF binary support with no built-in symbol table support: + +.. code-block:: shell + + CONFIG_ELF=y + CONFIG_LIBC_EXECFUNCS=y + # CONFIG_EXECFUNCS_HAVE_SYMTAB is not set + +3. Enable PATH variable support: + +.. code-block:: shell + + CONFIG_BINFMT_EXEPATH=y + CONFIG_PATH_INITIAL="/bin" + # CONFIG_DISABLE_ENVIRON not set + +4. Enable execution of ELF files from the ``NSH`` command line: + +.. code-block:: shell + + CONFIG_NSH_FILE_APPS=y + +.. note:: + + You must enable some application that uses ``printf()``. This is necessary + to assure that the symbol ``printf()`` is included in the base system. + Here we assume that you include the "Hello, World!" example from + ``apps/examples/hello``: + +.. code-block:: shell + + CONFIG_EXAMPLES_HELLO=y + +Then we can build the NuttX firmware image and the export package: + +.. code-block:: shell + + $ make + $ make export + +When ``make export`` completes, you will find a ZIP'ed package in the top-level +NuttX directory called ``nuttx-export-x.y.zip`` (for version ``x.y``). The +version is determined by the ``.version`` file in the same directory. The +content of this ZIP file is the following directory structure: + +.. code-block:: shell + + nuttx-export-x.x + |- arch/ + |- build/ + |- include/ + |- libs/ + |- startup/ + |- System.map + `- .config + +The Add-On Build Directory +-------------------------- + +In order to create the add-on ELF program, you will need (1) the export +package, (2) the program build ``Makefile``, (3) a linker script used by the +``Makefile``, and (4) a Bash script to create a linker script. That +``Makefile`` and Bash Script are discussed in the following paragraphs. + +.. note:: + + These example files implicitly assume a GNU tool chain is used and, in at + least one place, that the target is an ARMv7-M platform. A non-GNU tool + chain would probably require a significantly different ``Makefile`` and + linker script. There is at least one ARMv7-M specific change that would + have to be made for other platforms in the script that creates the linker + script (``mkdefines.sh``). + +Hello Example +------------- + +To keep things manageable, let's use a concrete example. Suppose the ELF +program that we wish to add to the release code is the single source file +``hello.c``: + +.. code-block:: c + + #include + + int main(int argc, char **argv) + { + printf("Hello from Add-On Program!\n"); + return 0; + } + +Let's say that we have a directory called ``addon`` and it contains the +``hello.c`` source file, a ``Makefile`` that will create the ELF program, and a +Bash script called ``mkdefines.sh`` that will create a linker script. + +Building the ELF Program +------------------------ + +The first step in creating the ELF program is to unzip the Export Package. We +start with our ``addon`` directory containing the following: + +.. code-block:: shell + + $ cd addon + $ ls + gnu-elf.ld hello.c Makefile mkdefines.sh nuttx-export-7.25.zip + +Where: + +- ``gnu-elf.ld`` is the linker script. +- ``hello.c`` is our example source file. +- ``Makefile`` will build our ELF program and symbol table. +- ``mksymtab.h`` is the Bash script that will create the symbol table for the + ELF program. +- ``nuttx-export-7.25.zip`` is the Export Package for NuttX-7.25. + +We unzip the Export Package like: + +.. code-block:: shell + + $ unzip nuttx-export-7.25.zip + +Then we have a new directory called ``nuttx-export-7.25`` that contains all of +the content from the released NuttX code that we need to build the ELF +program. + +The Makefile +------------ + +The ELF program is created simply as: + +.. code-block:: shell + + $ make + +This uses the following ``Makefile`` to generate several files: + +- ``hello.o``: The compiled ``hello.c`` object. +- ``hello.r``: A "partially linked" ELF object that still has undefined + symbols. +- ``hello``: The fully linked, relocatable ELF program. +- ``linker.ld``: A linker script created by ``mkdefines.sh``. + +Only the resulting ``hello`` is needed. + +Below is the ``Makefile`` used to create the ELF program: + +.. code-block:: shell + + include nuttx-export-7.25/build/Make.defs + + # Long calls are need to call from RAM into FLASH + + ARCHCFLAGS += -mlong-calls + ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef + ARCHOPTIMIZATION = -Os -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer + ARCHINCLUDES = -I. -isystem nuttx-export-7.25/include + + CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHINCLUDES) -pipe + + CROSSDEV = arm-none-eabi- + CC = $(CROSSDEV)gcc + LD = $(CROSSDEV)ld + STRIP = $(CROSSDEV)strip --strip-unneeded + + # Setup up linker command line options + + LDRELFLAGS = -r + + LDELFFLAGS = -r -e main + LDELFFLAGS += -T defines.ld -T gnu-elf.ld + + # This might change in a different environment + + OBJEXT ?= .o + + # This is the generated ELF program + + BIN = hello + REL = hello.r + + # These are the sources files that we use + + SRCS = hello.c + OBJS = $(SRCS:.c=$(OBJEXT)) + + # Build targets + + all: $(BIN) + .PHONY: clean + + $(OBJS): %$(OBJEXT): %.c + $(CC) -c $(CFLAGS) -o $@ $< + + System.map: nuttx-export-7.25/System.map + cat nuttx-export-7.25/System.map | sed -e "s/\r//g" >System.map + + $(REL): $(OBJS) + $(LD) $(LDRELFLAGS) -o $@ $< + + defines.ld: System.map $(REL) + ./mkdefines.sh System.map "$(REL)" >defines.ld + + $(BIN): defines.ld $(REL) + $(LD) $(LDELFFLAGS) -o $@ $(REL) + $(STRIP) $(REL) + + clean: + rm -f $(BIN) + rm -f $(REL) + rm -f defines.ld + rm -f System.map + rm -f *.o + +The Linker Script +----------------- + +Two linker scripts are used. One is a normal file (we'll call it the main +linker script), and the other, ``defines.ld``, is created on-the-fly as +described in the next section. + +The main linker script, ``gnu-elf.ld``, contains the following: + +.. code-block:: shell + + SECTIONS + { + .text 0x00000000 : + { + _stext = . ; + *(.text) + *(.text.*) + *(.gnu.warning) + *(.stub) + *(.glue_7) + *(.glue_7t) + *(.jcr) + _etext = . ; + } + + .rodata : + { + _srodata = . ; + *(.rodata) + *(.rodata1) + *(.rodata.*) + *(.gnu.linkonce.r*) + _erodata = . ; + } + + .data : + { + _sdata = . ; + *(.data) + *(.data1) + *(.data.*) + *(.gnu.linkonce.d*) + _edata = . ; + } + + .bss : + { + _sbss = . ; + *(.bss) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.b*) + *(COMMON) + _ebss = . ; + } + + /* Stabs debugging sections. */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } + } + +Creating the ``defines.ld`` Linker Script +----------------------------------------- + +The additional linker script ``defines.ld`` is created through a three-step +process: + +1. The ``Makefile`` generates a partially linked ELF object, ``hello.r``. +2. The ``Makefile`` then invokes the ``mkdefines.sh`` script, which generates + the ``defines.ld`` linker script that provides values for all of the + undefined symbols. +3. Finally, the ``Makefile`` produces the fully linked, relocatable ``hello`` + ELF object using the ``defines.ld`` linker script. + +Below is the version of ``mkdefines.sh`` used in this demo: + +.. code-block:: bash + + #!/bin/bash + + usage="Usage: $0 " + + # Check for the required path to the System.map file + + sysmap=$1 + if [ -z "$sysmap" ]; then + echo "ERROR: Missing " + echo "" + echo $usage + exit 1 + fi + + # Check for the required partially linked file + + relprog=$2 + if [ -z "$relprog" ]; then + echo "ERROR: Missing " + echo "" + echo $usage + exit 1 + fi + + # Verify the System.map and the partially linked file + + if [ ! -r "$sysmap" ]; then + echo "ERROR: $sysmap does not exist" + echo "" + echo $usage + exit 1 + fi + + if [ ! -r "$relprog" ]; then + echo "ERROR: $relprog does not exist" + echo "" + echo $usage + exit 1 + fi + + # Extract all of the undefined symbols from the partially linked file and create a + # list of sorted, unique undefined variable names. + + varlist=`nm $relprog | fgrep ' U ' | sed -e "s/^[ ]*//g" | cut -d' ' -f2 | sort - | uniq` + + # Now output the linker script that provides a value for all of the undefined symbols + + for var in $varlist; do + map=`grep " ${var}$" ${sysmap}` + if [ -z "$map" ]; then + echo "ERROR: Variable $var not found in $sysmap" + echo "" + echo $usage + exit 1 + fi + + varaddr=`echo ${map} | cut -d' ' -f1` + echo "${var} = 0x${varaddr} | 0x00000001;" + done + +This script uses the ``nm`` utility to find all of the undefined symbols in the +ELF object, then searches for the address of each undefined symbol in the +``System.map`` that was created when the released firmware was built. Finally, +it uses the symbol name and the symbol address to create each symbol table +entry. + +.. note:: + + - For the ARMv7-M architecture, bit 0 of the address must be set to indicate + thumb mode. If you are using a different architecture that requires + normal aligned addresses, you will need to change the following line by + eliminating the ORed value: + + .. code-block:: shell + + echo "${var} = 0x${varaddr} | 0x00000001;" + + - If the new ELF module uses a symbol that is not provided in the base + firmware and, hence, not included in the ``System.map`` file, this script + will fail. In that case, you will need to provide the missing logic + within the ELF program itself, if possible. + + - The technique as described here is only valid in the FLAT build mode. It + could probably also be extended to work in the PROTECTED mode by + substituting ``User.map`` for ``System.map``. + +Here is an example ``defines.ld`` created by ``mkdefines.sh``: + +.. code-block:: shell + + printf = 0x0800aefc | 0x00000001 ; + +Replacing an NSH Built-In Function +---------------------------------- + +Files can be executed by ``NSH`` from the command line by simply typing the +name of the ELF program. This requires: + +1. That the feature be enabled with``CONFIG_NSH_FILE_APP=y`` +2. That support for the PATH variable is enabled (``CONFIG_BINFMT_EXEPATH=y`` and + ``CONFIG_PATH_INITIAL`` set to the mount point of the file system that + may contain ELF programs). + +Suppose, for example, I have a built-in application called ``hello``. Before +installing the new replacement ``hello`` ELF program in the file system, this +is the version of ``hello`` that ``NSH`` will execute: + +.. code-block:: shell + + nsh> hello + Hello, World! + nsh> + +In the above configuration, ``NSH`` will first attempt to run the program called +``hello`` from the file system. This will fail because we have not yet placed +our custom ``hello`` ELF program in the file system. So instead, ``NSH`` will +fall back and execute the built-in application called ``hello``. + +In this way, any command known to ``NSH`` can be replaced by an ELF program +installed in a mounted file system directory that is found via the PATH +variable. + +Now suppose that we do add our custom ``hello`` to the file system. When +``NSH`` attempts to run the program called ``hello`` from the file system, it +will run successfully. The built-in version will be ignored. It has been +replaced with the version in the file system: + +.. code-block:: shell + + nsh> mount -t vfat /dev/mmcsd0 /bin + nsh> hello + Hello from Add-On Program! + nsh> + +Version Dependency +------------------ + +.. note:: + + This technique generates ELF programs using fixed addresses from the + ``System.map`` file of a versioned release. The generated ELF programs can + only be used with that specific firmware version. A crash will most likely + result if used with a different firmware version, because the addresses + from the ``System.map`` will not match the addresses in a different version + of the firmware. + +The alternative approach using :doc:`Symbol Tables ` is more +or less version independent. + +Tightly Coupled Memories +------------------------ + +Most MCUs based on ARMv7-M family processors support some kind of Tightly +Coupled Memory (TCM). These TCMs have somewhat different properties for +specialized operations. Depending on the bus matrix of the processor, you may +not be able to execute programs from TCM. For instance, the ``STM32 F4`` +supports Core Coupled Memory (CCM), but since it is tied directly to the D-bus, +it cannot be used to execute programs! On the other hand, the ``STM32F3`` has a +CCM that is accessible to both the D-Bus and the I-Bus, in which case it +should be possible to execute programs from this TCM. + +.. image:: ./image/system_arch_stm32f42xx_and_f43xx.png + +.. image:: ./image/system_arch_stm32f303xBC_and_f358xC.png + +When ELF programs are loaded into memory, the memory is allocated from the +heap via a standard memory allocator. By default with the ``STM32 F4``, the +CCM is included in ``HEAP`` and will typically be allocated first. If CCM +memory is allocated to hold the ELF program, a hard-fault will occur +immediately when you try to execute the ELF program in memory. + +Therefore, it is necessary on ``STM32 F4`` platforms to include the following +configuration setting: + +.. code-block:: shell + + CONFIG_STM32_CCMEXCLUDE=y + +With that setting, the CCM memory will be excluded from the heap, and so will +never be allocated for ELF program memory. diff --git a/Documentation/guides/image/system_arch_stm32f303xBC_and_f358xC.png b/Documentation/guides/image/system_arch_stm32f303xBC_and_f358xC.png new file mode 100644 index 0000000000000000000000000000000000000000..fdfdb8ed0e7a0b95086df3912fd17bfafe63781f GIT binary patch literal 16782 zcmch|3ALX%rHz7CWmVX6`75aQ`?+NLcL1qurYHghf)dEY;($Kq%xI|&b^9K zN#!*xO^uLBQb{UGs8l+=`aZ8qy*}^v@B8`OexKj(_W6GQ=w{7zUC-z9akxM3kHaN9 zz~5U#%|H!>LTUK=cm$zPN)QT#p1>=CZ{C+(Spz5Z!Dd$XKrcj8F3>=)W1?!GuX-l*Sc|=xpzXg`jA-KeFAUe zQ9o>L8y954GCKTeSL?13B0rfHj7DKOk##?RzQX(M*Y!F6-aN=DaV&*FG(x|Y@$FTb ziKPW(;+)}K^VmhFdB+wp5Fc*R1WWT_8J`9du66ceE+i2qDLR_ ze(gy`?ty8$AxEJ&(1<4`2Sd>h8yV%=(RcH2)$WKq*%E zPUBMv=f{68oI�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

G#!f{OBwf7-1(}F*RDNWexCZ20wf^MCiJD%D^ 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�qBef|9`rMd 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 QG2lOA19Sabx-OCb2QQzY?EnA( literal 0 HcmV?d00001 diff --git a/Documentation/guides/index.rst b/Documentation/guides/index.rst index 52e2cced76..b20ba5b022 100644 --- a/Documentation/guides/index.rst +++ b/Documentation/guides/index.rst @@ -56,4 +56,7 @@ Guides signal_events_interrupt_handlers.rst signaling_sem_priority_inheritance.rst smaller_vector_tables.rst - port.rst \ No newline at end of file + port.rst + updating_release_system_elf.rst + partially_linked_elf.rst + fully_linked_elf.rst \ No newline at end of file diff --git a/Documentation/guides/partially_linked_elf.rst b/Documentation/guides/partially_linked_elf.rst new file mode 100644 index 0000000000..507e6e2c63 --- /dev/null +++ b/Documentation/guides/partially_linked_elf.rst @@ -0,0 +1,429 @@ +ELF Programs – With Symbol Tables +================================= + +Updating a Release System with ELF Programs – With Symbol Tables +----------------------------------------------------------------- + +You can easily extend the firmware in your released, embedded system using +ELF programs provided via a file system. For example, an SD card or, perhaps, +downloaded into on-board SPI FLASH. + +In order to support such post-release updates, your released firmware must +support execution of ELF programs loaded into RAM and symbol tables also +provided via the file system (see `apps/examples/elf`). + +The files shown in this Wiki page can be downloaded +`here `_ + +Creating a Symbol Table +----------------------- + +There are several ways to create an application symbol table. Only two are +compatible with the example provided here: + +1. **Board-specific Bring-up Logic** + Build a symbol table into the base firmware and add it to your + board-specific bring-up logic. This technique is typically used in kernel + mode with ``CONFIG_USER_INITPATH=y``. + + In this setup, the system does not initialize using a standard C call like + ``nsh_main()``. Instead, it starts with an ``init`` ELF program, similar to + how Linux initializes. The configuration option + ``CONFIG_EXECFUNCS_SYMTAB_ARRAY`` initializes the system with a minimal set + of symbols required by the ``init`` program. Once initialized, the ``init`` + program would typically call ``boardctl()`` to put the final symbol table in + place. + + To enable this method, you must: + + - Set ``CONFIG_EXECFUNCS_HAVE_SYMTAB=y`` in your configuration. + - Provide a symbol table with the global name ``CONFIG_EXECFUNCS_SYMTAB_ARRAY`` with the variable name ``CONFIG_EXECFUNCS_NSYMBOLS_VAR`` that holds the number of symbol entries. The default symbol table name is ``g_symtab``. + + In this example, let's illustrate this using an STM32F4-Discovery + configuration. We will assume that you have modified the + ``boards/arm/stm32/stm32fdiscovery/src/stm32_bringup.c`` file, adding the + following: + + .. code-block:: c + + #include + #include + + const struct symtab_s g_symtab[] = { + {"printf", (FAR void *)printf} + }; + + int g_nsymbols = 1; + + This is a simple symbol table containing only the symbol string "printf," + whose value is the address of the function ``printf()``. + + There is, of course, a lot more that could be said about generating symbol + tables. NuttX provides specialized tools in the ``tools/`` directory and + instructions elsewhere for generating more extensive symbol tables. However, + this example keeps things simple to focus on the core functionality. + +2. **Application Logic** + Alternatively, the symbol table can be provided dynamically by the + application itself, using the ``boardctl()`` system interface. The specific + ``boardctl()`` command to use is ``BOARDIOC_APP_SYMTAB``. This command + provides the symbol table in the same way as the board-specific logic but + allows for application-level control. + + To use this approach, you need to: + - Enable the configurations ``CONFIG_LIB_BOARDCTL=y`` and ``CONFIG_BOARDCTL_APP_SYMTAB=y``. + - Include application logic to provide the symbol table. If ``CONFIG_EXAMPLES_NSH_SYMTAB=y`` is set, NSH can handle this automatically. + +Export Package +-------------- + +At the time of firmware release, you should create and save an export package. +This export package contains all the necessary files required to create +post-release add-on modules for your embedded system. + +For demonstration purposes, we use the STM32F4-Discovery with the network NSH +configuration. This setup assumes that you have the STM32F4DIS-BB baseboard. +The demonstration also requires support for externally modifiable media, such +as: + +- Removable media, like an SD card or USB flash drive. +- An internal file system remotely accessible via USB MSC, FTP, or other + protocols. +- A remote file system, such as NFS. + +In this demonstration, the networking NSH configuration uses the SD card on +the STM32 baseboard. Other NSH configurations can also be used, provided they +supply the necessary file system support. + +(No baseboard? You can add file system support to the basic ``STM32F4-Discovery`` +board by following these instructions: +`USB FLASH drive `_ +or `SD card `_.) + +Example for STM32F4-Discovery: + +.. code-block:: shell + + $ make distclean + $ tools/configure.sh -c stm32f4discovery:netnsh + $ make menuconfig + +Required configurations: + +- Disable networking: ``# CONFIG_NET is not set`` +- Enable ELF binary support: ``CONFIG_ELF=y``, ``CONFIG_LIBC_EXECFUNCS=y``, + ``CONFIG_EXECFUNCS_HAVE_SYMTAB=y``, ``CONFIG_EXECFUNCS_SYMTAB_ARRAY="g_symtab"`` and + ``CONFIG_EXECFUNCS_NSYMBOLS_VAR="g_nsymbols"`` +- Enable PATH variable support: ``CONFIG_BINFMT_EXEPATH=y``, + ``CONFIG_PATH_INITIAL="/bin"`` +- Enable execution from NSH: ``CONFIG_NSH_FILE_APPS=y`` + +Then, build the NuttX firmware image and the export package: + +.. code-block:: shell + + $ make + $ make export + +When ``make export`` completes, you will find a ZIP package in the top-level +NuttX directory called ``nuttx-export-x.y.zip`` (where x.y corresponds to the +version, determined by the .version file in the same directory). The contents +of this ZIP file are organized as follows: + +.. code-block:: text + + nuttx-export-x.x + |- arch/ + |- build/ + |- include/ + |- libs/ + |- startup/ + |- System.map + `- .config + +Add-On Build Directory +----------------------- + +In order to create the add-on ELF program, you will need: + +1. The export package. +2. A program build Makefile. +3. A linker script used by the Makefile. + +The example Makefile discussed below assumes the use of a GNU toolchain. Note +that non-GNU toolchains would likely require a significantly different +Makefile and linker script. + +Hello Example +------------- + +To keep things manageable, let's use a concrete example. Suppose the ELF +program that we wish to add to the release code is the simple +source file ``hello.c``: + +.. code-block:: c + + #include + + int main(int argc, char **argv) + { + printf("Hello from Add-On Program!\n"); + return 0; + } + +Let's say that we have a directory called ``addon`` that contains the following: + +1. The ``hello.c`` source file. +2. A Makefile to build the ELF program. +3. A linker script called ``gnu-elf.ld`` needed by the Makefile. +4. The export package ``nuttx-export-7.25.zip``. + + +Building the ELF Program +------------------------ + +The first step in creating the ELF program is to unzip the export +package. Starting in the ``addon`` directory: + +.. code-block:: shell + + $ cd addon + $ ls + gnu-elf.ld hello.c Makefile nuttx-export-7.25.zip + +Where: +- ``gnu-elf.ld`` is the linker script. +- ``hello.c`` is the example source file. +- ``Makefile`` builds the ELF program. +- ``nuttx-export-7.25.zip`` is the export package from NuttX 7.25. + +Unzip the export package as follows: + +.. code-block:: shell + + $ unzip nuttx-export-7.25.zip + +This creates a new directory called ``nuttx-export-7.25``, containing +all the content from the released NuttX code required to build +the ELF program. + + +The Makefile +------------ + +To build the ELF program, simply run: + +.. code-block:: shell + + $ make + +This uses the following Makefile to generate several files: +- ``hello.o``: The compiled object file for ``hello.c``. +- ``hello``: The linked ELF program. + +Only the resulting ``hello`` file is needed. + +The Makefile used to create the ELF program is as follows: + +.. code-block:: shell + + include nuttx-export-7.25/build/Make.defs + + # Long calls are need to call from RAM into FLASH + + ARCHCFLAGS += -mlong-calls + ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef + ARCHOPTIMIZATION = -Os -fno-strict-aliasing -fno-strength-reduce -fomit-frame-pointer + ARCHINCLUDES = -I. -isystem nuttx-export-7.25/include + + CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHINCLUDES) -pipe + + CROSSDEV = arm-none-eabi- + CC = $(CROSSDEV)gcc + LD = $(CROSSDEV)ld + STRIP = $(CROSSDEV)strip --strip-unneeded + + # Setup up linker command line options + + LDELFFLAGS = -r -e main + LDELFFLAGS += -T gnu-elf.ld + + # This might change in a different environment + + OBJEXT ?= .o + + # This is the generated ELF program + + BIN = hello + + # These are the sources files that we use + + SRCS = hello.c + OBJS = $(SRCS:.c=$(OBJEXT)) + + # Build targets + + all: $(BIN) + .PHONY: clean + + $(OBJS): %$(OBJEXT): %.c + $(CC) -c $(CFLAGS) $< -o $@ + + $(BIN): $(OBJS) + $(LD) $(LDELFFLAGS) -o $@ $^ + $(STRIP) $(BIN) + + clean: + rm -f $(BIN) + rm -f *.o + +The Linker Script +----------------- + +The linker script that I am using in this example, gnu-elf.ld, +contains the following: + +.. code-block:: shell + + SECTIONS + { + .text 0x00000000 : + { + _stext = . ; + *(.text) + *(.text.*) + *(.gnu.warning) + *(.stub) + *(.glue_7) + *(.glue_7t) + *(.jcr) + _etext = . ; + } + + .rodata : + { + _srodata = . ; + *(.rodata) + *(.rodata1) + *(.rodata.*) + *(.gnu.linkonce.r*) + _erodata = . ; + } + + .data : + { + _sdata = . ; + *(.data) + *(.data1) + *(.data.*) + *(.gnu.linkonce.d*) + _edata = . ; + } + + .bss : + { + _sbss = . ; + *(.bss) + *(.bss.*) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.b*) + *(COMMON) + _ebss = . ; + } + + /* Stabs debugging sections. */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } + } + +Replacing NSH Built-In Functions +-------------------------------- + +Files can be executed by NSH from the command line by simply typing the name +of the ELF program. This requires (1) that the feature be enabled with +``CONFIG_NSH_FILE_APP=y`` and (2) that support for the PATH variable is +enabled with ``CONFIG_BINFMT_EXEPATH=y`` and ``CONFIG_PATH_INITIAL`` set to +the mount point of the file system that may contain ELF programs. + +In this example, there is no application in the base firmware called +``hello``. So attempts to run ``hello`` will fail: + +.. code-block:: shell + + nsh> hello + nsh: hello: command not found + nsh> + +But if we mount the SD card containing the ``hello`` image that we created +above, then we can successfully execute the ``hello`` command: + +.. code-block:: shell + + nsh> mount -t vfat /dev/mmcsd0 /bin + nsh> ls /bin + /bin: + System Volume Information/ + hello + nsh> hello + Hello from Add-On Program! + nsh> + +Here we showed how you can add a new command to NSH to a product without +modifying the base firmware. We can also replace or update an existing +built-in application in this way: + +In the above configuration, NSH will first attempt to run the program called +``hello`` from the file system. This will fail because we have not yet put +our custom ``hello`` ELF program in the file system. So instead, NSH will +fallback and execute the built-in application called ``hello``. In this way, +any command known to NSH can be replaced from an ELF program installed in a +mounted file system directory that can be found via the PATH variable. + +After we do add our custom ``hello`` to the file system, when NSH attempts to +run the program called ``hello`` from the file system it will run +successfully. The built-in version will be ignored. It has been replaced with +the version in the file system. + +Tightly Coupled Memories +------------------------ + +Most MCUs based on ARMv7-M family processors support some kind of Tightly +Coupled Memory (TCM). These TCMs have somewhat different properties for +specialized operations. Depending on the bus matrix of the processor, you +may not be able to execute programs from the TCM. For instance, the STM32 F4 +supports Core Coupled Memory (CCM), but since it is tied directly to the +D-bus, it cannot be used to execute programs! On the other hand, the STM32F3 +has a CCM that is accessible to both the D-Bus and the I-Bus, in which case +it should be possible to execute programs from this TCM. + +.. image:: ./image/system_arch_stm32f42xx_and_f43xx.png + +.. image:: ./image/system_arch_stm32f303xBC_and_f358xC.png + +When ELF programs are loaded into memory, the memory is allocated from the +heap via a standard memory allocator. By default with the STM32 F4, the CCM +is included in the heap and will typically be allocated first. If CCM memory +is allocated to hold the ELF program in memory, then a hard-fault will occur +immediately when you try to execute the ELF program in memory. + +Therefore, it is necessary on STM32 F4 platforms to include the following +configuration setting: + +.. code-block:: shell + + CONFIG_STM32_CCMEXCLUDE=y + +With that setting, the CCM memory will be excluded from the heap and so will +never be allocated for ELF program memory. diff --git a/Documentation/guides/updating_release_system_elf.rst b/Documentation/guides/updating_release_system_elf.rst new file mode 100644 index 0000000000..2b13913e7c --- /dev/null +++ b/Documentation/guides/updating_release_system_elf.rst @@ -0,0 +1,25 @@ +Updating a Release System with ELF Programs +============================================ + +You can enhance the functionality of your released embedded system by adding +ELF programs, which can be loaded from a file system. These programs can be +stored on an SD card or downloaded into on-board SPI FLASH, allowing for +easy updates or extensions to the system's firmware. + +There are two ways you can accomplish this: + +Partially linked +---------------- +This describes building the partially linked, relocatable ELF program that +depends on a symbol table provided by the base firmware in FLASH. + +Reference: +- See :doc:`Partially Linked ELF Programs ` + +Fully linked +------------ +This describes building a fully linked, relocatable ELF program that does +not depend on any symbol table information. + +Reference: +- See :doc:`Fully Linked ELF Programs `