circuitpython/tools
Alessandro Gatti bf2005de9e tools/mpy_ld.py: Resolve fixed-address symbols if requested.
This commit lets mpy_ld.py resolve symbols not only from the object
files involved in the linking process, or from compiler-supplied static
libraries, but also from a list of symbols referenced by an absolute
address (usually provided by the system's ROM).

This is needed for ESP8266 targets as some C stdlib functions are
provided by the MCU's own ROM code to reduce the final code footprint,
and therefore those functions' implementation was removed from the
compiler's support libraries.  This means that unless `LINK_RUNTIME` is
set (which lets tooling look at more libraries to resolve symbols) the
build process will fail as tooling is unaware of the ROM symbols'
existence.  With this change, fixed-address symbols can be exposed to
the symbol resolution step when performing natmod linking.

If there are symbols coming in from a fixed-address symbols list and
internal code or external libraries, the fixed-address symbol address
will take precedence in all cases.

Although this is - in theory - also working for the whole range of ESP32
MCUs, testing is currently limited to Xtensa processors and the example
natmods' makefiles only make use of this commit's changes for the
ESP8266 target.

Natmod builds can set the MPY_EXTERN_SYM_FILE variable pointing to a
linkerscript file containing a series of symbols (weak or strong) at a
fixed address; these symbols will then be used by the MicroPython
linker when packaging the natmod.  If a different natmod build method is
used (eg. custom CMake scripts), `tools/mpy_ld.py` can now accept a
command line parameter called `--externs` (or its short variant `-e`)
that contains the path of a linkerscript file with the fixed-address
symbols to use when performing the linking process.

The linkerscript file parser can handle a very limited subset of
binutils's linkerscript syntax, namely just block comments, strong
symbols, and weak symbols.  Each symbol must be in its own line for the
parser to succeed, empty lines or comment blocks are skipped.  For an
example of what this parser was meant to handle, you can look at
`ports/esp8266/boards/eagle.rom.addr.v6.ld` and follow its format.

The natmod developer documentation is also updated to reflect the new
command line argument accepted by `mpy_ld.py` and the use cases for the
changes introduced by this commit.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
2025-06-04 22:35:39 +10:00
..
autobuild mimxrt: Add support for a UF2 bootloader. 2025-02-10 11:28:39 +11:00
mpremote tools/mpremote/tests: Add tests for 'fs tree' command. 2025-05-18 00:20:43 +10:00
.gitattributes micropython-upip: Mark as binary file and re-commit. 2015-06-06 23:09:23 +03:00
ar_util.py tools/mpy_ld.py: Allow linking static libraries. 2025-03-17 13:03:27 +11:00
boardgen.py tools/boardgen.py: Provide macro defns for number of cpu/board pins. 2024-12-17 23:53:24 +11:00
cc1 tools: Add C middle-processor to make builtin tables proper hash tables. 2015-12-31 00:24:33 +00:00
ci.sh esp32: Update to use ESP-IDF v5.4.1. 2025-05-16 14:02:39 +10:00
codeformat.py nrf/modules/machine: Enable code formatting. 2024-03-26 12:49:09 +11:00
codestats.sh all: Prune trailing whitespace. 2024-03-07 16:25:17 +11:00
dfu.py tools/dfu.py: Make tool work with python3 when parsing DFU files. 2021-11-01 15:46:59 +11:00
file2h.py all: Reformat C and Python source code with tools/codeformat.py. 2020-02-28 10:33:03 +11:00
gen-changelog.sh tools/gen-changelog.sh: Exclude "-preview" tags from generated log. 2024-01-05 15:06:14 +11:00
gen-cpydiff.py tools/gen-cpydiff.py: Ensure every item has at least 2 TOC levels. 2025-05-16 11:52:03 +10:00
hci_trace_to_pcap.py extmod/modbluetooth: Make all HCI transports trace in the same format. 2023-04-26 11:37:20 +10:00
insert-usb-ids.py all: Fix strings with backslash by using raw string literals. 2023-05-02 11:55:02 +10:00
makemanifest.py tools/makemanifest.py: Generate working code for empty manifests. 2024-06-05 14:07:26 +02:00
manifestfile.py tools/manifestfile.py: Fix freeze() when script is an empty iterable. 2024-03-25 13:41:37 +11:00
metrics.py tools/metrics.py: Add VIRT_RV32 to the code size metrics. 2024-09-23 13:03:26 +10:00
mpy-tool.py tools/mpy-tool.py: Support calling main() from an external script. 2025-03-05 16:02:08 +11:00
mpy_bin2res.py tools/mpy_bin2res: Tools to convert binary resources to Python module. 2017-07-27 14:41:27 +03:00
mpy_cross_all.py all: Remove MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE. 2021-09-16 16:04:03 +10:00
mpy_ld.py tools/mpy_ld.py: Resolve fixed-address symbols if requested. 2025-06-04 22:35:39 +10:00
pyboard.py tools/pyboard.py: Add write_timeout and catch errors in enter_raw_repl. 2025-06-02 17:02:59 +10:00
pydfu.py all: Upgrade to ruff v0.9.6. 2025-02-25 13:02:49 +01:00
uf2conv.py all: Fix strings with backslash by using raw string literals. 2023-05-02 11:55:02 +10:00
uf2families.json tools/uf2conv.py: Update to latest version. 2022-02-02 23:43:58 +11:00
uncrustify.cfg all: Fix spelling mistakes based on codespell check. 2023-04-27 18:03:06 +10:00
verifygitlog.py tools/verifygitlog.py: Allow long co-author and sign-off names. 2025-05-15 13:03:11 +10:00