Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How could I graphically display the memory layout from a .map file? [closed]

Tags:

c++

c

linker

My gcc build toolchain produces a .map file. How do I display the memory map graphically?

like image 555
JeffV Avatar asked Sep 07 '08 13:09

JeffV


People also ask

What is memory mapping in C?

Advertisements. The mmap() system call provides mapping in the virtual address space of the calling process that maps the files or devices into memory. This is of two types − File mapping or File-backed mapping − This mapping maps the area of the process' virtual memory to the files.


2 Answers

Here's the beginnings of a script in Python. It loads the map file into a list of Sections and Symbols (first half). It then renders the map using HTML (or do whatever you want with the sections and symbols lists).

You can control the script by modifying these lines:

with open('t.map') as f: colors = ['9C9F84', 'A97D5D', 'F7DCB4', '5C755E'] total_height = 32.0 

map2html.py

from __future__ import with_statement import re  class Section:     def __init__(self, address, size, segment, section):         self.address = address         self.size = size         self.segment = segment         self.section = section     def __str__(self):         return self.section+""  class Symbol:     def __init__(self, address, size, file, name):         self.address = address         self.size = size         self.file = file         self.name = name     def __str__(self):         return self.name  #=============================== # Load the Sections and Symbols # sections = [] symbols = []  with open('t.map') as f:     in_sections = True     for line in f:         m = re.search('^([0-9A-Fx]+)\s+([0-9A-Fx]+)\s+((\[[ 0-9]+\])|\w+)\s+(.*?)\s*$', line)         if m:             if in_sections:                 sections.append(Section(eval(m.group(1)), eval(m.group(2)), m.group(3), m.group(5)))             else:                 symbols.append(Symbol(eval(m.group(1)), eval(m.group(2)), m.group(3), m.group(5)))         else:             if len(sections) > 0:                 in_sections = False   #=============================== # Gererate the HTML File #  colors = ['9C9F84', 'A97D5D', 'F7DCB4', '5C755E'] total_height = 32.0  segments = set() for s in sections: segments.add(s.segment) segment_colors = dict() i = 0 for s in segments:     segment_colors[s] = colors[i % len(colors)]     i += 1  total_size = 0 for s in symbols:     total_size += s.size  sections.sort(lambda a,b: a.address - b.address) symbols.sort(lambda a,b: a.address - b.address)  def section_from_address(addr):     for s in sections:         if addr >= s.address and addr < (s.address + s.size):             return s     return None  print "<html><head>" print "  <style>a { color: black; text-decoration: none; font-family:monospace }</style>" print "<body>" print "<table cellspacing='1px'>" for sym in symbols:     section = section_from_address(sym.address)     height = (total_height/total_size) * sym.size     font_size = 1.0 if height > 1.0 else height     print "<tr style='background-color:#%s;height:%gem;line-height:%gem;font-size:%gem'><td style='overflow:hidden'>" % \         (segment_colors[section.segment], height, height, font_size)     print "<a href='#%s'>%s</a>" % (sym.name, sym.name)     print "</td></tr>" print "</table>" print "</body></html>" 

And here's a bad rendering of the HTML it outputs:

Map

like image 101
Frank Krueger Avatar answered Sep 20 '22 21:09

Frank Krueger


I've written a C# program to display the information in a Map file along with information not usually present in the map file (like static symbols provided you can use binutils). The code is available here. In short it parses the map file and also uses BINUTILS (if available) to gather more information. To run it you need to download the code and run the project under visual studio, browse to the map file path and click Analyze.

Note: Only works for GCC/LD map files

Screenshot: [3]

like image 25
Sredni Avatar answered Sep 19 '22 21:09

Sredni