A single-file, browser-based viewer for GNU ld / binutils linker map files.
Drop a .map file onto the page and get an interactive breakdown of where your
firmware's flash and RAM actually went — by memory region, output section,
object file, library, input section and symbol.
The tool was developed and tested against STM32 (arm-none-eabi) projects, so
that is where it is best proven. It should, however, work with any GNU
ld / binutils map file: no section names, target or vendor conventions are
hard-coded. Whether a section occupies bytes in the image is deduced from the
map's own structure — ld's OUTPUT() marker, run-time address aliasing,
overlapping ranges, and whether the load-address counter advanced. Sections the
map genuinely cannot resolve are flagged as unconfirmed rather than guessed at,
and any classification can be overridden by hand.
That should cover other vendors and other architectures — RISC-V, AVR, MSP430,
Xtensa, MIPS, PowerPC — as well as hosted (non-bare-metal) targets. If a
Memory Configuration block is absent, regions are synthesised from the section
layout. Reports of maps that parse badly are welcome.
- Tree view — Region → Section → Object file → Symbols, or Region → Section → Input section → Symbols. Sort by size, address or name; filter across symbols, objects and sections; toggle hex sizes and zero-size entries.
- Memory map view — a graphical, zoomable layout of the address space at symbol, input-section or output-section granularity. Colour by output section, object file or library; scale to the used range or the full region; highlight matching items; optionally show unused gaps.
- Sections view — every output section with its VMA, LMA, size and how it is being counted (in the image / no image bytes / not in the image at all). Any classification can be overridden manually, and all totals update.
- CSV export — flat
Region, Section, Archive, Object, InputSection, Symbol, Address, Sizerows for spreadsheet or script analysis. - Light / dark theme.
Open the hosted page above, or clone the repo and open index.html directly in
a browser — it is one self-contained file with no build step, no dependencies
and no server required.
Then drop your .map file onto the page (or click to browse).
If you just want to try it, LwIP_UDP_Echo_Server.map
is included in this repo — the STM32Cube LwIP UDP echo server example built for
a NUCLEO-H723ZG. Download it and drop it onto the page.
Pass -Wl,-Map=<file> to the compiler driver at link time.
target_link_options(${PROJECT_NAME} PRIVATE
-Wl,-Map=$<TARGET_FILE_DIR:${PROJECT_NAME}>/${PROJECT_NAME}.map
)This writes <project>.map next to the linked binary in the build tree.
LDFLAGS += -Wl,-Map=$(TARGET).maparm-none-eabi-gcc ... -Wl,-Map=firmware.map -o firmware.elfFor the richest output, also enable cross references and keep the default
verbosity of the map — the analyzer reads the Memory Configuration and
Linker script and memory map sections.
This tool was generated with AI assistance (Anthropic's Claude). The parsing
logic, heuristics and UI were produced by a language model and reviewed by a
human, but they have not been formally verified. Treat the numbers as a guide
for investigation rather than an authoritative accounting of your binary — cross
check anything that matters against size, nm or objdump.