Custom bootloader on ESP32-C6: esp_partition / esp_system include issue

Hendrik
Posts: 1
Joined: Tue Aug 05, 2025 4:55 am

Custom bootloader on ESP32-C6: esp_partition / esp_system include issue

Postby Hendrik » Tue Aug 05, 2025 6:37 am

Hi there,

I'm developing a custom bootloader with OTA switching, rollback, firmware validation, and a few other features.

Machine: Win11
System: ESP-IDF v5.3.1

I want to use the `esp_partition.h` library, but when I include it, I get an error saying that `esp_system.h` is missing.
So I added `esp_system.h` manually to my includes – but the error persists. I'm not sure why this is happening, and I've been stuck with this issue for a few days now.

project structure:
project_root\bootloader_components\main\*all .c files incl. CMakeLists*
project_root\bootloader_components\main\include\*all .h files*
project_root\main\dummy_app.c
project_root\main\CMakeLists
project_root\CMakeLists
project_root\partition_table\partitions.csv

Relevant CMakeLists.txt (inside bootloader_components/main)

Code: Select all

idf_component_register(
    SRCS
        "bootloader_main.c"
        "gpio_boot.c"
        "uart_boot.c"
        "rtc_boot.c"
        "validation_boot.c"
        "nvs_boot.c"
    INCLUDE_DIRS
        "include"
    REQUIRES
        bootloader_support
        esp_partition
        log
        esp_system
)

target_link_libraries(${COMPONENT_LIB} INTERFACE "-u call_start_cpu0")

set(BOOT_LD "${IDF_PATH}/components/bootloader/subproject/main/ld/${IDF_TARGET}/bootloader.ld")
set(BOOT_ROM_LD "${IDF_PATH}/components/bootloader/subproject/main/ld/${IDF_TARGET}/bootloader.rom.ld")

target_link_options(${COMPONENT_LIB} INTERFACE
                    "-T${BOOT_LD}"
                    "-T${BOOT_ROM_LD}")
Header + function usage (simplified):

Code: Select all

#include "validation_boot.h"
#include "esp_log.h"
#include "esp_partition.h"
#include "esp_image_format.h"

esp_partition_read()
esp_partition_find_first()
esp_image_verify()
Here is my error log after a fullclean and idf.py bootloader (build):

Code: Select all

[7/9] Performing build step for 'bootloader'
FAILED: bootloader-prefix/src/bootloader-stamp/bootloader-build bootloader/bootloader.elf bootloader/bootloader.bin bootloader/bootloader.map C:/Users/WiFi_Chip_Bootloader/build/bootloader-prefix/src/bootloader-stamp/bootloader-build C:/Users/WiFi_Chip_Bootloader/build/bootloader/bootloader.elf C:/Users/WiFi_Chip_Bootloader/build/bootloader/bootloader.bin C:/Users/WiFi_Chip_Bootloader/build/bootloader/bootloader.map
cmd.exe /C "cd /D C:\Users\WiFi_Chip_Bootloader\build\bootloader && C:\Users\.espressif\tools\cmake\3.24.0\bin\cmake.exe --build ."
[93/121] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj
FAILED: esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj
C:\Users\.espressif\tools\riscv32-esp-elf\esp-13.2.0_20240530\riscv32-esp-elf\bin\riscv32-esp-elf-gcc.exe -DBOOTLOADER_BUILD=1 -DESP_PLATFORM -DIDF_VER=\"v5.3.1-dirty\" -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -IC:/Users/WiFi_Chip_Bootloader/build/bootloader/config -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/app_update/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/log/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom/include/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_common/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/include/soc -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/include/soc/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/dma/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/ldo/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/port/esp32c6/. -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/port/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/port/esp32c6/private_include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/newlib/platform_include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/riscv/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/soc/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/soc/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/soc/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support/bootloader_flash/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support/private_include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_app_format/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_bootloader_format/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_partition/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/efuse/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/efuse/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/spi_flash/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/hal/platform_port/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/hal/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/hal/include -march=rv32imac_zicsr_zifencei  -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -nostartfiles -Os -freorder-blocks -fmacro-prefix-map=C:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader/subproject=. -fmacro-prefix-map=C:/Espressif/frameworks/esp-idf-v5.3.1=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -fno-stack-protector -std=gnu17 -Wno-old-style-declaration -MD -MT esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj -MF esp-idf\app_update\CMakeFiles\__idf_app_update.dir\esp_ota_ops.c.obj.d -o esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj -c C:/Espressif/frameworks/esp-idf-v5.3.1/components/app_update/esp_ota_ops.c
C:/Espressif/frameworks/esp-idf-v5.3.1/components/app_update/esp_ota_ops.c:29:10: fatal error: esp_system.h: No such file or directory
   29 | #include "esp_system.h"
      |          ^~~~~~~~~~~~~~
compilation terminated.
[96/121] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/validation_boot.c.obj
FAILED: esp-idf/main/CMakeFiles/__idf_main.dir/validation_boot.c.obj
C:\Users\.espressif\tools\riscv32-esp-elf\esp-13.2.0_20240530\riscv32-esp-elf\bin\riscv32-esp-elf-gcc.exe -DBOOTLOADER_BUILD=1 -DESP_PLATFORM -DIDF_VER=\"v5.3.1-dirty\" -DSOC_MMU_PAGE_SIZE=CONFIG_MMU_PAGE_SIZE -DSOC_XTAL_FREQ_MHZ=CONFIG_XTAL_FREQ -D_GLIBCXX_HAVE_POSIX_SEMAPHORE -D_GLIBCXX_USE_POSIX_SEMAPHORE -D_GNU_SOURCE -IC:/Users/WiFi_Chip_Bootloader/build/bootloader/config -IC:/Users/WiFi_Chip_Bootloader/bootloader_components/main/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/log/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom/include/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_rom/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_common/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/include/soc -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/include/soc/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/dma/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/ldo/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/port/esp32c6/. -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/port/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_hw_support/port/esp32c6/private_include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/newlib/platform_include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/riscv/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/soc/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/soc/esp32c6 -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/soc/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support/bootloader_flash/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader_support/private_include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/esp_partition/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/spi_flash/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/hal/platform_port/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/hal/esp32c6/include -IC:/Espressif/frameworks/esp-idf-v5.3.1/components/hal/include -march=rv32imac_zicsr_zifencei  -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wall -Werror=all -Wno-error=unused-function -Wno-error=unused-variable -Wno-error=unused-but-set-variable -Wno-error=deprecated-declarations -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-enum-conversion -gdwarf-4 -ggdb -nostartfiles -Os -freorder-blocks -fmacro-prefix-map=C:/Espressif/frameworks/esp-idf-v5.3.1/components/bootloader/subproject=. -fmacro-prefix-map=C:/Espressif/frameworks/esp-idf-v5.3.1=/IDF -fstrict-volatile-bitfields -fno-jump-tables -fno-tree-switch-conversion -fno-stack-protector -std=gnu17 -Wno-old-style-declaration -MD -MT esp-idf/main/CMakeFiles/__idf_main.dir/validation_boot.c.obj -MF esp-idf\main\CMakeFiles\__idf_main.dir\validation_boot.c.obj.d -o esp-idf/main/CMakeFiles/__idf_main.dir/validation_boot.c.obj -c C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c: In function 'bootloader_validate_image':      
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c:72:9: error: implicit declaration of function strcpy' [-Werror=implicit-function-declaration]
   72 |         strcpy(label, "factory");
      |         ^~~~~~
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c:4:1: note: include '<string.h>' or provide a declaration of 'strcpy'
    3 | #include "esp_partition.h"
  +++ |+#include <string.h>
    4 | #include "esp_image_format.h"
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c:72:9: warning: incompatible implicit declaration of built-in function 'strcpy' [-Wbuiltin-declaration-mismatch]
   72 |         strcpy(label, "factory");
      |         ^~~~~~
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c:72:9: note: include '<string.h>' or provide a declaration of 'strcpy'
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c:77:9: warning: incompatible implicit declaration of built-in function 'strcpy' [-Wbuiltin-declaration-mismatch]
   77 |         strcpy(label, "test");
      |         ^~~~~~
C:/Users/WiFi_Chip_Bootloader/bootloader_components/main/validation_boot.c:77:9: note: include '<string.h>' or provide a declaration of 'strcpy'
cc1.exe: some warnings being treated as errors
[102/121] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/uart_boot.c.obj
ninja: build stopped: subcommand failed.
ninja: build stopped: subcommand failed.
Compilation failed because esp_ota_ops.c (in "app_update" component) includes esp_system.h, provided by esp_system component(s).
However, esp_system component(s) is not in the requirements list of "app_update".
To fix this, add esp_system to PRIV_REQUIRES list of idf_component_register call in C:\Espressif\frameworks\esp-idf-v5.3.1\components\app_update\CMakeLists.txt.
ninja failed with exit code 1, output of the command is in the C:\Users\WiFi_Chip_Bootloader\build\log\idf_py_stderr_output_27824 and C:\Users\WiFi_Chip_Bootloader\build\log\idf_py_stdout_output_27824
Any ideas what might be going wrong here? Appreciate any pointers!

Thank you!
Hendrik

RathiSonika
Espressif staff
Espressif staff
Posts: 27
Joined: Thu Jun 22, 2023 2:58 pm

Re: Custom bootloader on ESP32-C6: esp_partition / esp_system include issue

Postby RathiSonika » Thu Aug 07, 2025 8:12 am

Hello, esp_partition component is not available in bootloader context for ESP-IDF v5.3.1. The support was added in IDF-version5.4. You can try upgrading to ESP-IDF version 5.4 (release/v5.4) or above to check if it works.
As documented in the official ESP-IDF bootloader guide (https://docs.espressif.com/projects/esp ... bootloader), you cannot use drivers and functions from other components in the bootloader space unless they explicitly support running in the bootloader environment. I hope this helps!

Who is online

Users browsing this forum: meta-externalagent and 5 guests