Back to Esp Idf

Historical note

tools/test_apps/system/init_array/README.md

6.1-dev1.4 KB
Original Source
Supported TargetsESP32ESP32-C2ESP32-C3ESP32-C5ESP32-C6ESP32-C61ESP32-H2ESP32-H21ESP32-H4ESP32-P4ESP32-S2ESP32-S3ESP32-S31Linux

Historical note

Initially, ESP-IDF used the do_global_ctors() function to run global constructors. This was done to accommodate Xtensa targets that emit .ctors.* sections, which are ordered in descending order.

For RISC-V, compilation used .init_array.* sections, which are designed to have ascending order. Priority constructors in .init_array.* sections were correctly processed in ascending order. However, non-priority .init_array section was processed in descending order (as it was done for Xtensa .ctors).

Starting with ESP-IDF v6.0, the implementation switched to the standard LibC behavior (__libc_init_array()), which processes both priority and non-priority constructors in ascending order.

To achieve this, a breaking changes were introduced:

  • Xtensa .ctors.* entries converted to .init_array.* format (ascending), to be passed to __libc_init_array().
  • Processing order of non-priority .init_array and .ctors sections was changed from descending to ascending.

This test ensures that the initialization order is correct and consistent between ESP-IDF and Linux targets.