Comment puis-je afficher graphiquement la disposition de la mémoire à partir d'un fichier .map ?[fermé]

StackOverflow https://stackoverflow.com/questions/48426

  •  09-06-2019
  •  | 
  •  

Question

Ma chaîne d'outils de construction gcc produit un fichier .map.Comment afficher graphiquement la carte mémoire ?

Était-ce utile?

La solution

Voici les débuts d'un script en Python.Il charge le fichier de carte dans une liste de sections et de symboles (première moitié).Il restitue ensuite la carte en utilisant HTML (ou faites ce que vous voulez avec le sections et symbols listes).

Vous pouvez contrôler le script en modifiant ces lignes :

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>"

Et voici un mauvais rendu du code HTML généré :

Map

Autres conseils

J'ai écrit un programme C# pour afficher les informations d'un fichier de carte ainsi que des informations qui ne sont généralement pas présentes dans le fichier de carte (comme les symboles statiques fournis que vous pouvez utiliser binutils).Le code est disponible ici.En bref, il analyse le fichier map et utilise également BINUTILS (si disponible) pour recueillir plus d’informations.Pour l'exécuter, vous devez télécharger le code et exécuter le projet sous Visual Studio, accédez au chemin du fichier de carte et cliquez sur Analyze.

Note:Ne fonctionne que pour GCC/LD fichiers de carte

Capture d'écran:[3]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top