# Arduino-ESP32 firmware: Library notice, sources and relinking

Notice: this firmware uses the LGPL-licensed Arduino core library.
The images listed below statically link Arduino-ESP32 3.3.10, including Library
modules licensed under the GNU Lesser General Public License, version 2.1 or
(at your option) any later version. You may modify the work for your own use
and reverse engineer it to debug those modifications. Each package supplies
the objects, exact link and image commands, linker map, source commands,
input hashes and instructions to use a modified Library.

First-party example sketches and the supplied relink.sh, rebuild-object.py
(repository source esp32-relink-rebuild.py) and esp32-relink-tools.py scripts
are MIT, holder **Breadboard**, by owner decision 2026-10-04 (BRE-345).
Upstream examples and other components retain their own
terms. See [LGPL-2.1](LICENSES/Arduino-ESP32-LGPL-2.1.md),
[first-party MIT terms](LICENSES/Breadboard-MIT.txt) and the full LICENSES/
directory in each package and SDK bundle, also available as a notices bundle.

The relinked image is compared **byte for byte**, including its embedded ELF
identity, in CI. The canonical image is linked from exactly the stripped
objects supplied here. No executable bytes are patched and no DWARF is served.
The P4 simulator fallback loads the served esp32p4-blink.bin as a separate asset.

The Zigbee images also link Espressif's ZBOSS stack archives
(`libzboss_stack.*.a`, esp-zboss-lib 1.6.4), shipped byte for byte as Espressif
distributes them, under the ZBOSS licence
([ZBOSS-LICENSE.txt](LICENSES/ZBOSS-LICENSE.txt)). Its clause 4 forbids reverse
engineering, decompiling, modifying or disassembling that binary. By owner
decision 2026-10-04 Breadboard reads clause 4 as covering only the ZBOSS
binary's own bytes; everything else may be modified, relinked and reverse
engineered as the LGPL permits, relinking with the ZBOSS stack unchanged.
`libzboss_port.native.a` and `libesp_zb_api.*.a` are esp-zigbee-lib 1.6.8
under Apache-2.0; the port archive is also shipped unchanged.

Unzip a package and download its named shared SDK/notices bundles into the
parent directory; relink.sh verifies their SHA-256 and extracts missing inputs.
Follow its README.md. Linux x86_64 tools are installed by
the enclosed esp32-relink-tools.py from pinned, hash-verified archives. After
installation, relinking and Library-object replacement work offline. Run
`sh relink.sh` for an unchanged build, or `sh relink.sh --modified` after
rebuilding a changed Library object with rebuild-object.py.

| Served image | Relink package | Package bytes | Served SHA-256 |
|---|---|---:|---|
| [`arduino-802154-txprobe-c6.bin`](../arduino-802154-txprobe-c6.bin) | [802154-txprobe-c6-relink.zip](802154-txprobe-c6-relink.zip) | 596,524 | `609323b429076665574c4af5901ab076b99e8807f0b48fa4f72b35c2d7ff8ff9` |
| [`arduino-blink-c3.bin`](../arduino-blink-c3.bin) | [blink-c3-relink.zip](blink-c3-relink.zip) | 547,511 | `18c8dc915c196f3bf5f18b7258280da0f35d668aa7392afb73b92834db6345ed` |
| [`arduino-blink-c6.bin`](../arduino-blink-c6.bin) | [blink-c6-relink.zip](blink-c6-relink.zip) | 572,060 | `4b934ea8f6179906590294954c9176cffd1a0cb1c3f8e92f924d7219cfe4c53d` |
| [`arduino-blink-esp32.bin`](../arduino-blink-esp32.bin) | [blink-esp32-relink.zip](blink-esp32-relink.zip) | 758,489 | `69e615263656185b571f72329fda205ad733e6b1d6d702ea9347e63ad018b9a2` |
| [`arduino-blink-s3.bin`](../arduino-blink-s3.bin) | [blink-s3-relink.zip](blink-s3-relink.zip) | 694,089 | `d8f90d7741d28bcdf2e18e05df6d37515d2e0433c8b4b157a41a9e0e6e0ae5f9` |
| [`arduino-gpio-interrupt-c3.bin`](../arduino-gpio-interrupt-c3.bin) | [gpio-interrupt-c3-relink.zip](gpio-interrupt-c3-relink.zip) | 548,276 | `c831b0801c0313c89d5a8d35047648b51925eb5f5398bc9c2166adf6f24f2c74` |
| [`arduino-openthread-cli-c6.bin`](../arduino-openthread-cli-c6.bin) | [openthread-cli-c6-relink.zip](openthread-cli-c6-relink.zip) | 948,114 | `2a006b89f9e1d1d4fde9708f7dab33529630e6027d2d65274b4d2167890289a8` |
| [`arduino-openthread-cli-h2.bin`](../arduino-openthread-cli-h2.bin) | [openthread-cli-h2-relink.zip](openthread-cli-h2-relink.zip) | 931,421 | `35190f5bb4bf6321e7d2ce74f7a926ded5c9fa2e89cf9bb4141565e2cc456fa1` |
| [`arduino-openthread-leader-c6.bin`](../arduino-openthread-leader-c6.bin) | [openthread-leader-c6-relink.zip](openthread-leader-c6-relink.zip) | 954,681 | `fccc8df5a4b8ae377c8e8ab38e6b6349a148829aef1824ee5ca61411d0164f6a` |
| [`arduino-openthread-node-c6.bin`](../arduino-openthread-node-c6.bin) | [openthread-node-c6-relink.zip](openthread-node-c6-relink.zip) | 955,063 | `76d9115ddad5ac7e3f30c5294060fd34b424055254ee09431da1e2481287cfd5` |
| [`arduino-openthread-node-h2.bin`](../arduino-openthread-node-h2.bin) | [openthread-node-h2-relink.zip](openthread-node-h2-relink.zip) | 938,466 | `d8826f018b1b2bb8d44a233b6d3793c56fc44cefb470ec42bcd71642c226e142` |
| [`arduino-rmt-ledc-timing-h2.bin`](../arduino-rmt-ledc-timing-h2.bin) | [rmt-ledc-timing-h2-relink.zip](rmt-ledc-timing-h2-relink.zip) | 567,025 | `e4e85fa348a4a00300608949b62b34ddfb7eb0f7153b9167fc7cd36a594839ba` |
| [`arduino-sd-c3.bin`](../arduino-sd-c3.bin) | [sd-c3-relink.zip](sd-c3-relink.zip) | 640,067 | `d825174bc9b6f24c193fdc7f270aa1b6f6818f9ebf1b6a646cccca14e5967334` |
| [`arduino-sd-c6.bin`](../arduino-sd-c6.bin) | [sd-c6-relink.zip](sd-c6-relink.zip) | 678,229 | `d1062d01f79710f3356decbf265f7002a4a3b2bb3b8cccaf3cf95e8c24a6e9db` |
| [`arduino-serial-parity-c3.bin`](../arduino-serial-parity-c3.bin) | [serial-parity-c3-relink.zip](serial-parity-c3-relink.zip) | 552,920 | `2723b92939ffbb9d7833714edad55b35bffd45f0acced5183c9d24de6432588a` |
| [`arduino-serial-parity-c6.bin`](../arduino-serial-parity-c6.bin) | [serial-parity-c6-relink.zip](serial-parity-c6-relink.zip) | 591,370 | `4f8ee9c0236a38bd5ec2afa09364de0dcd24fc5026c3725144d3bf754a9adbff` |
| [`arduino-spi-clock-c5.bin`](../arduino-spi-clock-c5.bin) | [spi-clock-c5-relink.zip](spi-clock-c5-relink.zip) | 3,385,235 | `ca30730411e6924401884c7a878864a779f177920a97fae57af6a0a7997fa70f` |
| [`arduino-spi-clock-h2.bin`](../arduino-spi-clock-h2.bin) | [spi-clock-h2-relink.zip](spi-clock-h2-relink.zip) | 569,891 | `2c66dc1f2c7598787da1fd239a29f6300734d4226ae063d6fc94348954875009` |
| [`arduino-spi-tft-c3.bin`](../arduino-spi-tft-c3.bin) | [spi-tft-c3-relink.zip](spi-tft-c3-relink.zip) | 698,129 | `b3d86e5a5ef8009f941ef9d571536b1d1e315869444c7b34b9862f1ef5c9568f` |
| [`arduino-spi-tft-c6.bin`](../arduino-spi-tft-c6.bin) | [spi-tft-c6-relink.zip](spi-tft-c6-relink.zip) | 737,894 | `e67901e47ecf52fe3fb5e37ce4b1af4e94b627a23589f21c533b3901ffbcfda4` |
| [`arduino-thread-hub-c6.bin`](../arduino-thread-hub-c6.bin) | [thread-hub-c6-relink.zip](thread-hub-c6-relink.zip) | 952,341 | `157c9beb20e95d5b23ca99fbbc3a84bcae02ec8e33473782ef42ace38b18057b` |
| [`arduino-thread-sensor-c6.bin`](../arduino-thread-sensor-c6.bin) | [thread-sensor-c6-relink.zip](thread-sensor-c6-relink.zip) | 951,303 | `8dd54969a493a480dbcf55fe6189ac0615c0a6c71196951e219ae31056743bd5` |
| [`arduino-uart0-heartbeat-esp32.bin`](../arduino-uart0-heartbeat-esp32.bin) | [uart0-heartbeat-esp32-relink.zip](uart0-heartbeat-esp32-relink.zip) | 773,207 | `21158ae41be2395c48432ceb728ff8056a9874cbb34aabffd86dd56eca1237f0` |
| [`arduino-uart0-heartbeat-s3.bin`](../arduino-uart0-heartbeat-s3.bin) | [uart0-heartbeat-s3-relink.zip](uart0-heartbeat-s3-relink.zip) | 685,846 | `2277832433a45aa638d9e9df555d501211a85f34b3f767452f0fbdf17c0513d4` |
| [`arduino-zigbee-colorbulb-c6.bin`](../arduino-zigbee-colorbulb-c6.bin) | [zigbee-colorbulb-c6-relink.zip](zigbee-colorbulb-c6-relink.zip) | 1,004,628 | `c8ba48eedafb4edfe01bfcb204bf516ba3bbca715244e5bcf3f405a902b9aff6` |
| [`arduino-zigbee-colorremote-c6.bin`](../arduino-zigbee-colorremote-c6.bin) | [zigbee-colorremote-c6-relink.zip](zigbee-colorremote-c6-relink.zip) | 1,030,397 | `7dae544903cfd64e29fd288d1767eec8b52bf7028cd4508916ed60e71c999ad2` |
| [`arduino-zigbee-contact-c6.bin`](../arduino-zigbee-contact-c6.bin) | [zigbee-contact-c6-relink.zip](zigbee-contact-c6-relink.zip) | 1,002,041 | `7d27734ce50c01672a3ed08b5be7372dd596e714dcbbd5d23493fcc6b87df486` |
| [`arduino-zigbee-light-c6.bin`](../arduino-zigbee-light-c6.bin) | [zigbee-light-c6-relink.zip](zigbee-light-c6-relink.zip) | 1,009,685 | `7f3ae042677810998fa7366ee62d76b8ff3a0e2f601341b3e635825382216a63` |
| [`arduino-zigbee-switch-c6.bin`](../arduino-zigbee-switch-c6.bin) | [zigbee-switch-c6-relink.zip](zigbee-switch-c6-relink.zip) | 1,042,050 | `7543c3b0d40954cf69f6674f95f52970e4209bdbca228b92df3ee97753b6e6e6` |
| [`arduino-zigbee-switch-h2.bin`](../arduino-zigbee-switch-h2.bin) | [zigbee-switch-h2-relink.zip](zigbee-switch-h2-relink.zip) | 1,018,854 | `34dfe3cc82e0a2bc513441a4bc4b85ba707b8a8302e947b03302073f882b39ca` |
| [`arduino-zigbee-tempsensor-c6.bin`](../arduino-zigbee-tempsensor-c6.bin) | [zigbee-tempsensor-c6-relink.zip](zigbee-tempsensor-c6-relink.zip) | 1,004,169 | `fd7b6b08f377be9f0b5e929b907efdffbfe0002db82ab4de1b7457582183024a` |
| [`arduino-zigbee-thermostat-c6.bin`](../arduino-zigbee-thermostat-c6.bin) | [zigbee-thermostat-c6-relink.zip](zigbee-thermostat-c6-relink.zip) | 1,026,395 | `7a0ad656a08eb0386d3af87b458bae271971173ea819be2c1717e7c4129fa340` |
| [`esp32p4-blink.bin`](../esp32p4-blink.bin) | [esp32p4-blink-relink.zip](esp32p4-blink-relink.zip) | 2,254,081 | `5ab9ceee449631ad4845ed36c3ec5f8526073683d3699decdfe46a2ed24dfc72` |

## Shared SDK members and notices

- [arduino-esp32-3.3.10-notices.zip](arduino-esp32-3.3.10-notices.zip) (110,850 bytes)
- [arduino-esp32-3.3.10-esp32-sdk.zip](arduino-esp32-3.3.10-esp32-sdk.zip) (3,735,638 bytes)
- [arduino-esp32-3.3.10-esp32c3-sdk.zip](arduino-esp32-3.3.10-esp32c3-sdk.zip) (2,957,073 bytes)
- [arduino-esp32-3.3.10-esp32c6-sdk.zip](arduino-esp32-3.3.10-esp32c6-sdk.zip) (10,467,415 bytes)
- [arduino-esp32-3.3.10-esp32h2-sdk.zip](arduino-esp32-3.3.10-esp32h2-sdk.zip) (8,750,881 bytes)
- [arduino-esp32-3.3.10-esp32s3-sdk.zip](arduino-esp32-3.3.10-esp32s3-sdk.zip) (2,426,931 bytes)

## Corresponding source

- [arduino-esp32-3.3.10-core-source.zip](arduino-esp32-3.3.10-core-source.zip) (1,219,730 bytes)
- [arduino-esp32-3.3.10-esp32-headers-source.zip](arduino-esp32-3.3.10-esp32-headers-source.zip) (1,158,909 bytes)
- [arduino-esp32-3.3.10-esp32c3-headers-source.zip](arduino-esp32-3.3.10-esp32c3-headers-source.zip) (1,129,256 bytes)
- [arduino-esp32-3.3.10-esp32c5-headers-source.zip](arduino-esp32-3.3.10-esp32c5-headers-source.zip) (1,343,567 bytes)
- [arduino-esp32-3.3.10-esp32c6-headers-source.zip](arduino-esp32-3.3.10-esp32c6-headers-source.zip) (2,182,960 bytes)
- [arduino-esp32-3.3.10-esp32h2-headers-source.zip](arduino-esp32-3.3.10-esp32h2-headers-source.zip) (2,131,939 bytes)
- [arduino-esp32-3.3.10-esp32p4-headers-source.zip](arduino-esp32-3.3.10-esp32p4-headers-source.zip) (1,475,381 bytes)
- [arduino-esp32-3.3.10-esp32s3-headers-source.zip](arduino-esp32-3.3.10-esp32s3-headers-source.zip) (1,527,949 bytes)
- [arduino-esp32-3.3.10-libraries-source.zip](arduino-esp32-3.3.10-libraries-source.zip) (210,669 bytes)

The core bundle includes the complete participating Library modules; chip
bundles hold the recorded SDK header/flag closure. Each bundle lists
omissions with hashes and reasons. Compiler headers and runtime libraries
come from the pinned compiler archives. Third-party notices, including
the GCC Runtime Library Exception, are retained in LICENSES/.
