I'm co-founder of a startup building a new IDE for microcontrollers: Embeetle IDE. We would like to support the ESP32 family in our IDE, so I'm figuring out the ESP32 build system.
While figuring out the build system, I currently focus on how the ESP-IDF tool builds projects, and how Arduino IDE builds ESP projects on the other hand.
2. Questions
The ESP-IDF framework has a set of "component libraries". In the Arduino IDE, they are available as precompiled archives. Comparing both raised a lot of questions to me. I'll explain in the next paragraphs.
3. The Arduino "component libraries"
The Arduino IDE stores the ESP32 component libraries as archive files here:
~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/lib/
I'm trying to figure out how these precompiled component libraries were built in the first place. Thanks to my previous question (see viewtopic.php?f=19&t=20396) I now know where to find the source code for them. If you have the esp-idf tool installed, the source code can be found here:
~/esp/esp-idf/components/
Compiling this source code into those component libraries is not straightforward. This is what I do:
1. I launch a "Hello World" project with the esp-idf tool.
2. I replace the file '~/esp/hello_world/sdkconfig' with '~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/sdkconfig'. In other words, I try to apply the Arduino configurations onto my "Hello World" project.
3. I build the "Hello World" project with full verbosity to see how the component libraries are built.
Since my "Hello World" project has now the exact same configuration settings as Arduino (thanks to replacing the 'sdkconfig' file), the esp component libraries that appear in my project's build folder should be the same as those in the '~/.arduino15/packages/esp32/hardware/esp32/1.0.6/tools/sdk/lib/' folder. Is this correct?
If that's correct, then the three-step-approach described above is sufficient to figure out how the component libraries were built for the Arduino IDE.
4. Linking the "component libraries" with the application code
The Arduino IDE uses its precompiled "component libraries" totally different from how ESP-IDF uses them in the linking step of the final application .elf file. This is how Arduino does it:
Code: Select all
xtensa-esp32-elf-g++ -nostdlib
-L<esp-sdk>/lib
-L<esp-sdk>/ld
-T esp32_out.ld
-T esp32.project.ld
-T esp32.rom.ld
-T esp32.peripherals.ld
-T esp32.rom.libgcc.ld
-T esp32.rom.spiram_incompatible_fns.ld
-u esp_app_desc
-u ld_include_panic_highint_hdl
-u call_user_start_cpu0
-Wl,--gc-sections
-Wl,-static
-Wl,--undefined=uxTopUsedPriority
-u __cxa_guard_dummy
-u __cxx_fatal_exception
-Wl,--start-group
/tmp/arduino_build_852524/sketch/WiFiScan.ino.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/ETH.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFi.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiAP.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiClient.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiGeneric.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiMulti.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiSTA.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiScan.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiServer.cpp.o
/tmp/arduino_build_852524/libraries/WiFi/WiFiUdp.cpp.o
/tmp/arduino_build_852524/core/core.a
-lgcc
-lesp_websocket_client
-lwpa2
-ldetection
-lesp_https_server
-lwps
-lhal
-lconsole
-lpe
-lsoc
-lsdmmc
-lpthread
-llog
-lesp_http_client
-ljson
-lmesh
-lesp32-camera
-lnet80211
-lwpa_supplicant
-lc
-lmqtt
-lcxx
-lesp_https_ota
-lulp
-lefuse
-lpp
-lmdns
-lbt
-lwpa
-lspiffs
-lheap
-limage_util
-lunity
-lrtc
-lmbedtls
-lface_recognition
-lnghttp
-ljsmn
-lopenssl
-lcore
-lfatfs
-lm
-lprotocomm
-lsmartconfig
-lxtensa-debug-module
-ldl
-lesp_event
-lesp-tls
-lfd
-lespcoredump
-lesp_http_server
-lfr
-lsmartconfig_ack
-lwear_levelling
-ltcp_transport
-llwip
-lphy
-lvfs
-lcoap
-lesp32
-llibsodium
-lbootloader_support
-ldriver
-lcoexist
-lasio
-lod
-lmicro-ecc
-lesp_ringbuf
-ldetection_cat_face
-lapp_update
-lespnow
-lface_detection
-lapp_trace
-lnewlib
-lbtdm_app
-lwifi_provisioning
-lfreertos
-lfreemodbus
-lethernet
-lnvs_flash
-lspi_flash
-lc_nano
-lexpat
-lfb_gfx
-lprotobuf-c
-lesp_adc_cal
-ltcpip_adapter
-lstdc++
-Wl,--end-group
-Wl,-EL
-o /tmp/arduino_build_852524/WiFiScan.ino.elf
This is how the linking happens with the ESP-IDF tool:
Code: Select all
xtensa-esp32-elf-g++ -mlongcalls
-Wno-frame-address
CMakeFiles/hello-world.elf.dir/project_elf_src_esp32.c.obj
-o hello-world.elf
esp-idf/mbedtls/libmbedtls.a
esp-idf/efuse/libefuse.a esp-idf/app_update/libapp_update.a
esp-idf/bootloader_support/libbootloader_support.a
esp-idf/esp_ipc/libesp_ipc.a esp-idf/spi_flash/libspi_flash.a
esp-idf/nvs_flash/libnvs_flash.a esp-idf/pthread/libpthread.a
esp-idf/esp_gdbstub/libesp_gdbstub.a esp-idf/espcoredump/libespcoredump.a
esp-idf/esp_system/libesp_system.a esp-idf/esp_rom/libesp_rom.a
esp-idf/hal/libhal.a esp-idf/vfs/libvfs.a
esp-idf/esp_eth/libesp_eth.a
esp-idf/tcpip_adapter/libtcpip_adapter.a
esp-idf/esp_netif/libesp_netif.a esp-idf/esp_event/libesp_event.a
esp-idf/wpa_supplicant/libwpa_supplicant.a
esp-idf/esp_wifi/libesp_wifi.a
esp-idf/lwip/liblwip.a
esp-idf/log/liblog.a
esp-idf/heap/libheap.a
esp-idf/soc/libsoc.a
esp-idf/esp_hw_support/libesp_hw_support.a esp-idf/esp_pm/libesp_pm.a
esp-idf/esp_ringbuf/libesp_ringbuf.a
esp-idf/driver/libdriver.a esp-idf/xtensa/libxtensa.a
esp-idf/perfmon/libperfmon.a esp-idf/esp32/libesp32.a
esp-idf/esp_common/libesp_common.a
esp-idf/esp_timer/libesp_timer.a
esp-idf/freertos/libfreertos.a
esp-idf/newlib/libnewlib.a
esp-idf/cxx/libcxx.a
esp-idf/app_trace/libapp_trace.a
esp-idf/asio/libasio.a
esp-idf/bt/libbt.a
esp-idf/cbor/libcbor.a
esp-idf/unity/libunity.a
esp-idf/cmock/libcmock.a
esp-idf/coap/libcoap.a
esp-idf/console/libconsole.a
esp-idf/nghttp/libnghttp.a
esp-idf/esp-tls/libesp-tls.a
esp-idf/esp_adc_cal/libesp_adc_cal.a
esp-idf/esp_hid/libesp_hid.a
esp-idf/tcp_transport/libtcp_transport.a
esp-idf/esp_http_client/libesp_http_client.a
esp-idf/esp_http_server/libesp_http_server.a
esp-idf/esp_https_ota/libesp_https_ota.a
esp-idf/protobuf-c/libprotobuf-c.a
esp-idf/protocomm/libprotocomm.a
esp-idf/mdns/libmdns.a
esp-idf/esp_local_ctrl/libesp_local_ctrl.a
esp-idf/sdmmc/libsdmmc.a
esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a
esp-idf/esp_websocket_client/libesp_websocket_client.a
esp-idf/expat/libexpat.a
esp-idf/wear_levelling/libwear_levelling.a
esp-idf/fatfs/libfatfs.a
esp-idf/freemodbus/libfreemodbus.a
esp-idf/jsmn/libjsmn.a
esp-idf/json/libjson.a
esp-idf/libsodium/liblibsodium.a
esp-idf/mqtt/libmqtt.a
esp-idf/openssl/libopenssl.a
esp-idf/spiffs/libspiffs.a
esp-idf/ulp/libulp.a
esp-idf/wifi_provisioning/libwifi_provisioning.a
esp-idf/main/libmain.a
-Wl,--cref -Wl,--Map=/home/kristof/esp/hello_world/build/hello-world.map -Wl,--gc-sections -fno-rtti -fno-lto esp-idf/asio/libasio.a
esp-idf/cbor/libcbor.a
esp-idf/cmock/libcmock.a
esp-idf/unity/libunity.a
esp-idf/coap/libcoap.a
esp-idf/esp_adc_cal/libesp_adc_cal.a
esp-idf/esp_hid/libesp_hid.a
esp-idf/esp_local_ctrl/libesp_local_ctrl.a
esp-idf/esp_websocket_client/libesp_websocket_client.a
esp-idf/expat/libexpat.a
esp-idf/fatfs/libfatfs.a
esp-idf/wear_levelling/libwear_levelling.a
esp-idf/freemodbus/libfreemodbus.a
esp-idf/jsmn/libjsmn.a
esp-idf/libsodium/liblibsodium.a
esp-idf/mqtt/libmqtt.a
esp-idf/openssl/libopenssl.a
esp-idf/spiffs/libspiffs.a
esp-idf/wifi_provisioning/libwifi_provisioning.a
esp-idf/protocomm/libprotocomm.a
esp-idf/bt/libbt.a
-L/home/kristof/esp/esp-idf/components/bt/controller/lib/esp32 -lbtdm_app esp-idf/protobuf-c/libprotobuf-c.a
esp-idf/mdns/libmdns.a
esp-idf/console/libconsole.a
esp-idf/json/libjson.a
esp-idf/mbedtls/libmbedtls.a
esp-idf/efuse/libefuse.a
esp-idf/app_update/libapp_update.a
esp-idf/bootloader_support/libbootloader_support.a
esp-idf/esp_ipc/libesp_ipc.a
esp-idf/spi_flash/libspi_flash.a
esp-idf/nvs_flash/libnvs_flash.a
esp-idf/pthread/libpthread.a
esp-idf/esp_gdbstub/libesp_gdbstub.a
esp-idf/espcoredump/libespcoredump.a
esp-idf/esp_system/libesp_system.a
esp-idf/esp_rom/libesp_rom.a
esp-idf/hal/libhal.a
esp-idf/vfs/libvfs.a
esp-idf/esp_eth/libesp_eth.a
esp-idf/tcpip_adapter/libtcpip_adapter.a
esp-idf/esp_netif/libesp_netif.a
esp-idf/esp_event/libesp_event.a
esp-idf/wpa_supplicant/libwpa_supplicant.a
esp-idf/esp_wifi/libesp_wifi.a
esp-idf/lwip/liblwip.a
esp-idf/log/liblog.a
esp-idf/heap/libheap.a
esp-idf/soc/libsoc.a
esp-idf/esp_hw_support/libesp_hw_support.a
esp-idf/esp_pm/libesp_pm.a
esp-idf/esp_ringbuf/libesp_ringbuf.a
esp-idf/driver/libdriver.a
esp-idf/xtensa/libxtensa.a
esp-idf/perfmon/libperfmon.a
esp-idf/esp32/libesp32.a
esp-idf/esp_common/libesp_common.a
esp-idf/esp_timer/libesp_timer.a
esp-idf/freertos/libfreertos.a
esp-idf/newlib/libnewlib.a
esp-idf/cxx/libcxx.a
esp-idf/app_trace/libapp_trace.a
esp-idf/nghttp/libnghttp.a
esp-idf/esp-tls/libesp-tls.a
esp-idf/tcp_transport/libtcp_transport.a
esp-idf/esp_http_client/libesp_http_client.a
esp-idf/esp_http_server/libesp_http_server.a
esp-idf/esp_https_ota/libesp_https_ota.a
esp-idf/sdmmc/libsdmmc.a
esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a
esp-idf/ulp/libulp.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcoexist.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcore.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libespnow.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libmesh.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libnet80211.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libpp.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libsmartconfig.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libwapi.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libphy.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/librtc.a
esp-idf/mbedtls/libmbedtls.a
esp-idf/efuse/libefuse.a
esp-idf/app_update/libapp_update.a
esp-idf/bootloader_support/libbootloader_support.a
esp-idf/esp_ipc/libesp_ipc.a
esp-idf/spi_flash/libspi_flash.a
esp-idf/nvs_flash/libnvs_flash.a
esp-idf/pthread/libpthread.a
esp-idf/esp_gdbstub/libesp_gdbstub.a
esp-idf/espcoredump/libespcoredump.a
esp-idf/esp_system/libesp_system.a
esp-idf/esp_rom/libesp_rom.a
esp-idf/hal/libhal.a
esp-idf/vfs/libvfs.a
esp-idf/esp_eth/libesp_eth.a
esp-idf/tcpip_adapter/libtcpip_adapter.a
esp-idf/esp_netif/libesp_netif.a
esp-idf/esp_event/libesp_event.a
esp-idf/wpa_supplicant/libwpa_supplicant.a
esp-idf/esp_wifi/libesp_wifi.a
esp-idf/lwip/liblwip.a
esp-idf/log/liblog.a
esp-idf/heap/libheap.a
esp-idf/soc/libsoc.a
esp-idf/esp_hw_support/libesp_hw_support.a
esp-idf/esp_pm/libesp_pm.a
esp-idf/esp_ringbuf/libesp_ringbuf.a
esp-idf/driver/libdriver.a
esp-idf/xtensa/libxtensa.a
esp-idf/perfmon/libperfmon.a
esp-idf/esp32/libesp32.a
esp-idf/esp_common/libesp_common.a
esp-idf/esp_timer/libesp_timer.a
esp-idf/freertos/libfreertos.a
esp-idf/newlib/libnewlib.a
esp-idf/cxx/libcxx.a
esp-idf/app_trace/libapp_trace.a
esp-idf/nghttp/libnghttp.a
esp-idf/esp-tls/libesp-tls.a
esp-idf/tcp_transport/libtcp_transport.a
esp-idf/esp_http_client/libesp_http_client.a
esp-idf/esp_http_server/libesp_http_server.a
esp-idf/esp_https_ota/libesp_https_ota.a
esp-idf/sdmmc/libsdmmc.a
esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a
esp-idf/ulp/libulp.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcoexist.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcore.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libespnow.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libmesh.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libnet80211.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libpp.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libsmartconfig.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libwapi.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libphy.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/librtc.a
esp-idf/mbedtls/libmbedtls.a
esp-idf/efuse/libefuse.a
esp-idf/app_update/libapp_update.a
esp-idf/bootloader_support/libbootloader_support.a
esp-idf/esp_ipc/libesp_ipc.a
esp-idf/spi_flash/libspi_flash.a
esp-idf/nvs_flash/libnvs_flash.a
esp-idf/pthread/libpthread.a
esp-idf/esp_gdbstub/libesp_gdbstub.a
esp-idf/espcoredump/libespcoredump.a
esp-idf/esp_system/libesp_system.a
esp-idf/esp_rom/libesp_rom.a
esp-idf/hal/libhal.a
esp-idf/vfs/libvfs.a
esp-idf/esp_eth/libesp_eth.a
esp-idf/tcpip_adapter/libtcpip_adapter.a
esp-idf/esp_netif/libesp_netif.a
esp-idf/esp_event/libesp_event.a
esp-idf/wpa_supplicant/libwpa_supplicant.a
esp-idf/esp_wifi/libesp_wifi.a
esp-idf/lwip/liblwip.a
esp-idf/log/liblog.a
esp-idf/heap/libheap.a
esp-idf/soc/libsoc.a
esp-idf/esp_hw_support/libesp_hw_support.a
esp-idf/esp_pm/libesp_pm.a
esp-idf/esp_ringbuf/libesp_ringbuf.a
esp-idf/driver/libdriver.a
esp-idf/xtensa/libxtensa.a
esp-idf/perfmon/libperfmon.a
esp-idf/esp32/libesp32.a
esp-idf/esp_common/libesp_common.a
esp-idf/esp_timer/libesp_timer.a
esp-idf/freertos/libfreertos.a
esp-idf/newlib/libnewlib.a
esp-idf/cxx/libcxx.a
esp-idf/app_trace/libapp_trace.a
esp-idf/nghttp/libnghttp.a
esp-idf/esp-tls/libesp-tls.a
esp-idf/tcp_transport/libtcp_transport.a
esp-idf/esp_http_client/libesp_http_client.a
esp-idf/esp_http_server/libesp_http_server.a
esp-idf/esp_https_ota/libesp_https_ota.a
esp-idf/sdmmc/libsdmmc.a
esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a
esp-idf/ulp/libulp.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcoexist.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcore.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libespnow.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libmesh.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libnet80211.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libpp.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libsmartconfig.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libwapi.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libphy.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/librtc.a
esp-idf/mbedtls/libmbedtls.a
esp-idf/efuse/libefuse.a
esp-idf/app_update/libapp_update.a
esp-idf/bootloader_support/libbootloader_support.a
esp-idf/esp_ipc/libesp_ipc.a
esp-idf/spi_flash/libspi_flash.a
esp-idf/nvs_flash/libnvs_flash.a
esp-idf/pthread/libpthread.a
esp-idf/esp_gdbstub/libesp_gdbstub.a
esp-idf/espcoredump/libespcoredump.a
esp-idf/esp_system/libesp_system.a
esp-idf/esp_rom/libesp_rom.a
esp-idf/hal/libhal.a
esp-idf/vfs/libvfs.a
esp-idf/esp_eth/libesp_eth.a
esp-idf/tcpip_adapter/libtcpip_adapter.a
esp-idf/esp_netif/libesp_netif.a
esp-idf/esp_event/libesp_event.a
esp-idf/wpa_supplicant/libwpa_supplicant.a
esp-idf/esp_wifi/libesp_wifi.a
esp-idf/lwip/liblwip.a
esp-idf/log/liblog.a
esp-idf/heap/libheap.a
esp-idf/soc/libsoc.a
esp-idf/esp_hw_support/libesp_hw_support.a
esp-idf/esp_pm/libesp_pm.a
esp-idf/esp_ringbuf/libesp_ringbuf.a
esp-idf/driver/libdriver.a
esp-idf/xtensa/libxtensa.a
esp-idf/perfmon/libperfmon.a
esp-idf/esp32/libesp32.a
esp-idf/esp_common/libesp_common.a
esp-idf/esp_timer/libesp_timer.a
esp-idf/freertos/libfreertos.a
esp-idf/newlib/libnewlib.a
esp-idf/cxx/libcxx.a
esp-idf/app_trace/libapp_trace.a
esp-idf/nghttp/libnghttp.a
esp-idf/esp-tls/libesp-tls.a
esp-idf/tcp_transport/libtcp_transport.a
esp-idf/esp_http_client/libesp_http_client.a
esp-idf/esp_http_server/libesp_http_server.a
esp-idf/esp_https_ota/libesp_https_ota.a
esp-idf/sdmmc/libsdmmc.a
esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a
esp-idf/ulp/libulp.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcoexist.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcore.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libespnow.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libmesh.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libnet80211.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libpp.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libsmartconfig.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libwapi.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libphy.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/librtc.a
esp-idf/mbedtls/libmbedtls.a
esp-idf/efuse/libefuse.a
esp-idf/app_update/libapp_update.a
esp-idf/bootloader_support/libbootloader_support.a
esp-idf/esp_ipc/libesp_ipc.a
esp-idf/spi_flash/libspi_flash.a
esp-idf/nvs_flash/libnvs_flash.a
esp-idf/pthread/libpthread.a
esp-idf/esp_gdbstub/libesp_gdbstub.a
esp-idf/espcoredump/libespcoredump.a
esp-idf/esp_system/libesp_system.a
esp-idf/esp_rom/libesp_rom.a
esp-idf/hal/libhal.a
esp-idf/vfs/libvfs.a
esp-idf/esp_eth/libesp_eth.a
esp-idf/tcpip_adapter/libtcpip_adapter.a
esp-idf/esp_netif/libesp_netif.a
esp-idf/esp_event/libesp_event.a
esp-idf/wpa_supplicant/libwpa_supplicant.a
esp-idf/esp_wifi/libesp_wifi.a
esp-idf/lwip/liblwip.a
esp-idf/log/liblog.a
esp-idf/heap/libheap.a
esp-idf/soc/libsoc.a
esp-idf/esp_hw_support/libesp_hw_support.a
esp-idf/esp_pm/libesp_pm.a
esp-idf/esp_ringbuf/libesp_ringbuf.a
esp-idf/driver/libdriver.a
esp-idf/xtensa/libxtensa.a
esp-idf/perfmon/libperfmon.a
esp-idf/esp32/libesp32.a
esp-idf/esp_common/libesp_common.a
esp-idf/esp_timer/libesp_timer.a
esp-idf/freertos/libfreertos.a
esp-idf/newlib/libnewlib.a
esp-idf/cxx/libcxx.a
esp-idf/app_trace/libapp_trace.a
esp-idf/nghttp/libnghttp.a
esp-idf/esp-tls/libesp-tls.a
esp-idf/tcp_transport/libtcp_transport.a
esp-idf/esp_http_client/libesp_http_client.a
esp-idf/esp_http_server/libesp_http_server.a
esp-idf/esp_https_ota/libesp_https_ota.a
esp-idf/sdmmc/libsdmmc.a
esp-idf/esp_serial_slave_link/libesp_serial_slave_link.a
esp-idf/ulp/libulp.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcoexist.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libcore.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libespnow.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libmesh.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libnet80211.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libpp.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libsmartconfig.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libwapi.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/libphy.a
/home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32/librtc.a
-Wl,--wrap=mbedtls_mpi_exp_mod
-u esp_app_desc
-u pthread_include_pthread_impl
-u pthread_include_pthread_cond_impl
-u pthread_include_pthread_local_storage_impl
-u ld_include_panic_highint_hdl
-u start_app
-u start_app_other_cores
-L /home/kristof/esp/esp-idf/components/esp_rom/esp32/ld
-T esp32.rom.ld
-T esp32.rom.api.ld
-T esp32.rom.libgcc.ld
-T esp32.rom.newlib-data.ld
-T esp32.rom.syscalls.ld
-u vfs_include_syscalls_impl
-L /home/kristof/esp/esp-idf/components/esp_wifi/lib/esp32
/home/kristof/esp/esp-idf/components/xtensa/esp32/libxt_hal.a
-L /home/kristof/esp/hello_world/build/esp-idf/esp32
-T esp32_out.ld
-L /home/kristof/esp/hello_world/build/esp-idf/esp32/ld
-T esp32.project.ld
-L /home/kristof/esp/esp-idf/components/esp32/ld
-T esp32.peripherals.ld
-u call_user_start_cpu0
-mfix-esp32-psram-cache-issue
-mfix-esp32-psram-cache-strategy=memw
-Wl,--undefined=uxTopUsedPriority
-u app_main
-lm esp-idf/newlib/libnewlib.a
-u newlib_include_heap_impl
-u newlib_include_syscalls_impl
-u newlib_include_pthread_impl
-lgcc
-u __cxa_guard_dummy
-lstdc++ esp-idf/pthread/libpthread.a
esp-idf/app_trace/libapp_trace.a
-lgcov
esp-idf/app_trace/libapp_trace.a
-lgcov
-lc
However, what really troubles me is that some component libraries appear twice or more in the ESP-IDF linker call! Take for example the mbedtls library. The Arduino linker call passes this library to the linker just once:
Code: Select all
xtensa-esp32-elf-g++
...
-lmbedtls
...
Code: Select all
xtensa-esp32-elf-g++
...
esp-idf/mbedtls/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
...
esp-idf/mbedtls/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedtls.a
esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a
esp-idf/mbedtls/mbedtls/library/libmbedx509.a
...
All of this confuses me. Why isn't there just a single libmbedtls.a file produced by the ESP-IDF tool?
Thank you very much for your help.