Call Graph
Who calls whom in the firmware, drawn from the image itself.
Needs: the ELF File (ELF / Symbols). No toolchain: the view decodes the bl and tail-call b.w instructions in the image's code and resolves them against the symbol table. Calls through function pointers cannot be seen statically and do not appear.
What it shows
A canvas of function nodes in BFS layers, the root on the left, each layer one call deeper, joined by arrows. Entry points (main, the reset handler, every vector-table handler) carry a green edge, interrupt handlers an amber one. A + at a node's right edge means the depth limit hid some of its callees; click it to expand that node in place, click again to fold it.
The status bar reports the graph size, how many functions and entry points the image has, and the decode statistics (calls resolved, tail calls, unresolved targets).
Workflow
- Set the ELF and press Generate. With no root typed the graph starts at
main(or the first entry point). - Type in Root to jump elsewhere; matching function names drop down as you type. Several roots separated by commas draw side by side.
- Depth limits the walk; Callees / Callers / Both choose the direction, so "who calls
printk" is one click. - Click a node to select it and light its edges; double-click to make it the root. With Peek on, hovering a node previews the callees the depth limit hid, as ghost nodes to its right.
- Drag the background to pan, wheel to zoom, Fit to see everything.
Tips
- The same walk is available headless:
viewalyzer-cli callgraph --elf firmware.elf --root main --depth 3(add--entriesto list entry points and decode statistics). - Literal pools inside functions are skipped through the toolchain's mapping symbols; an image built without them may show a few spurious edges.