MapVisual
Linker map files, visualized inside VS Code.

English | 简体中文
A linker map records where object files are mapped into memory, how common symbols are allocated, which archive members the link pulled in, and the values assigned to symbols, whether or not those symbols end up in the image. A real map runs to megabytes of dense text. MapVisual turns the .map from GNU ld or LLVM lld into a sortable, filterable symbol list with per-symbol Flash and RAM use, a treemap, a build-to-build diff, and a built-in C++ demangler.
Features
- Open a map: press
Alt+M and pick one, or double-click any .map file. Rebuild your firmware and the open view refreshes itself.
- Symbol-level list: sort by size, name, kind, section, object or address; group by object, library, section kind or directory; filter by text, kind or minimum size; hide compiler and runtime objects; see what
--gc-sections removed. Virtual scrolling keeps multi-megabyte maps fast.
- Memory usage: region usage bars, section-kind composition and the largest symbols in the side panel, plus a status-bar readout for the active map.
- Locate in raw map: click any symbol row and MapVisual opens the raw map beside the view with that line highlighted. Copy actions live in the row context menu.
- Treemap: switch the list to an area-proportional treemap and drill into any group.
- Map diff: compare two builds symbol by symbol (added / removed / changed), with Flash and RAM totals and CSV export.
- Built-in C++ demangling: the extension bundles a WASM demangler, so you need no toolchain or configuration. Symbols recovered from section names (
.text._ZN…) are demangled too, and both the mangled and demangled forms are searchable.
- Real linker output: handles
-ffunction-sections entries, LTO merged sections, --gc-sections discards, *fill* padding, static-archive members and relax annotations, and counts .data in both Flash and RAM.
- CSV export: the filtered rows, or just the rows you selected.
- Go to source: jump from a symbol to its source file in your workspace.
- CLI included: the same parser runs from the command line too (see below).
Getting started
- Install the extension from the marketplace (or from a
.vsix).
- Open a workspace containing your project and press
Alt+M, or double-click any .map file. MapVisual opens it by default.
- To read a map as plain text, use the Open as Text button in the editor title bar. To change the default permanently, right-click the file → Open With… → Configure default editor.
While reading a map:
- Toolbar:
C++ demangling, System (hide crt/libgcc/libc), Removed (gc-sectioned symbols), Treemap, Raw (open the raw map beside), CSV export.
- Rows: a plain click locates the symbol's line in the raw map;
Ctrl/Cmd+click multi-selects rows for a partial CSV export; right-click opens the row menu (copy the demangled name, the mangled name or the whole row, filter by object, go to source).
- Status bar: Flash and RAM totals for the map you are looking at.
Commands
| Command |
Key |
| MapVisual: Open Map File |
Alt+M |
| MapVisual: Compare Two Maps |
Alt+Shift+D |
| MapVisual: Open as Text |
editor title bar (while viewing a map) |
Settings
| Setting |
Default |
Description |
mapvisual.demangle |
true |
Demangle C++ symbol names (built-in WASM demangler). |
mapvisual.formatOverride |
auto |
Force the map format instead of auto-detection (gnu-ld / lld). |
Command line
The parser does not depend on VS Code. After building, the same engine runs as a CLI for scripts and AI assistants, with summary, symbols, treemap and diff commands. Output is JSON by default, or Markdown with --md:
node dist/cli.js summary firmware.map
node dist/cli.js symbols firmware.map --top 20 --kind code
node dist/cli.js treemap firmware.map --depth 2
node dist/cli.js diff old.map new.map
See docs/CLI.md for the full contract.
| Toolchain |
Status |
GNU ld (gcc, arm-none-eabi-gcc) |
✅ verified against real firmware builds |
LLVM lld (ld.lld) |
✅ verified against real builds |
| Keil armlink |
planned |
| IAR ilink |
planned |
Privacy
Parsing runs entirely on your machine, in a local worker process. The extension collects no telemetry and makes no network requests, so your firmware's symbols stay on your machine.
License
MIT
| |