Changeset e2b73d4f in mainline for kernel/tools/genmap.py


Ignore:
Timestamp:
2010-03-21T09:25:29Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
19f857a
Parents:
facebd56 (diff), 4e9aaf5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/tools/genmap.py

    rfacebd56 re2b73d4f  
    11#!/usr/bin/env python
     2#
     3# Copyright (c) 2006 Ondrej Palkovsky
     4# All rights reserved.
     5#
     6# Redistribution and use in source and binary forms, with or without
     7# modification, are permitted provided that the following conditions
     8# are met:
     9#
     10# - Redistributions of source code must retain the above copyright
     11#   notice, this list of conditions and the following disclaimer.
     12# - Redistributions in binary form must reproduce the above copyright
     13#   notice, this list of conditions and the following disclaimer in the
     14#   documentation and/or other materials provided with the distribution.
     15# - The name of the author may not be used to endorse or promote products
     16#   derived from this software without specific prior written permission.
     17#
     18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28#
     29
     30"""
     31Create binary symbol map out of linker map file
     32"""
    233
    334import sys
     
    536import re
    637
    7 MAXSTRING=63
    8 symtabfmt = "<Q%ds" % (MAXSTRING+1)
    9 
     38MAXSTRING = 63
     39symtabfmt = "<Q%ds" % (MAXSTRING + 1)
    1040
    1141funcline = re.compile(r'([0-9a-f]+)\s+[lg]\s+.\s+\.text\s+([0-9a-f]+)\s+(.*)$')
     
    1343dataline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.data\s+([0-9a-f]+)\s+(.*)$')
    1444fileexp = re.compile(r'([^\s]+):\s+file format')
     45startfile = re.compile(r'\.(text|bss|data)\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
     46
    1547def read_obdump(inp):
    16     funcs = {}
    17     data = {}
    18     bss ={}
    19     fname = ''
    20     for line in inp:
    21         line = line.strip()
    22         res = funcline.match(line)
    23         if res:
    24             funcs.setdefault(fname,[]).append((int(res.group(1),16),
    25                                                res.group(3)))
    26             continue
    27         res = bssline.match(line)
    28         if res:
    29             start = int(res.group(1),16)
    30             end = int(res.group(2),16)
    31             if end:
    32                 bss.setdefault(fname,[]).append((start,res.group(3)))
    33         res = dataline.match(line)
    34         if res:
    35             start = int(res.group(1),16)
    36             end = int(res.group(2),16)
    37             if end:
    38                 data.setdefault(fname,[]).append((start,res.group(3)))
    39         res = fileexp.match(line)
    40         if res:
    41             fname = res.group(1)
    42             continue
     48        "Parse input"
     49       
     50        funcs = {}
     51        data = {}
     52        bss = {}
     53        fname = ''
     54       
     55        for line in inp:
     56                line = line.strip()
     57                res = funcline.match(line)
     58                if (res):
     59                        funcs.setdefault(fname, []).append((int(res.group(1), 16), res.group(3)))
     60                        continue
     61               
     62                res = bssline.match(line)
     63                if (res):
     64                        start = int(res.group(1), 16)
     65                        end = int(res.group(2), 16)
     66                        if (end):
     67                                bss.setdefault(fname, []).append((start, res.group(3)))
     68               
     69                res = dataline.match(line)
     70                if (res):
     71                        start = int(res.group(1), 16)
     72                        end = int(res.group(2), 16)
     73                        if (end):
     74                                data.setdefault(fname, []).append((start, res.group(3)))
     75               
     76                res = fileexp.match(line)
     77                if (res):
     78                        fname = res.group(1)
     79                        continue
     80       
     81        return {'text' : funcs, 'bss' : bss, 'data' : data}
    4382
    44     return {
    45         'text' : funcs,
    46         'bss' : bss,
    47         'data' : data
    48         }
    49 
    50 startfile = re.compile(r'\.(text|bss|data)\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
    5183def generate(kmapf, obmapf, out):
    52     obdump = read_obdump(obmapf)   
    53 
    54     def sorter(x,y):
    55         return cmp(x[0],y[0])
    56 
    57     for line in kmapf:
    58         line = line.strip()
    59         res = startfile.match(line)
    60 
    61         if res and obdump[res.group(1)].has_key(res.group(3)):
    62             offset = int(res.group(2),16)
    63             fname = res.group(3)
    64             symbols = obdump[res.group(1)][fname]
    65             symbols.sort(sorter)
    66             for addr,symbol in symbols:               
    67                 value = fname + ':' + symbol
    68                 data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING])
    69                 out.write(data)
    70                
    71     out.write(struct.pack(symtabfmt,0,''))
     84        "Generate output file"
     85       
     86        obdump = read_obdump(obmapf)
     87       
     88        def sorter(x,y):
     89                return cmp(x[0],y[0])
     90       
     91        for line in kmapf:
     92                line = line.strip()
     93                res = startfile.match(line)
     94               
     95                if ((res) and (obdump[res.group(1)].has_key(res.group(3)))):
     96                        offset = int(res.group(2), 16)
     97                        fname = res.group(3)
     98                        symbols = obdump[res.group(1)][fname]
     99                        symbols.sort(sorter)
     100                        for addr, symbol in symbols:
     101                                value = fname + ':' + symbol
     102                                data = struct.pack(symtabfmt, addr + offset, value[:MAXSTRING])
     103                                out.write(data)
     104                       
     105        out.write(struct.pack(symtabfmt, 0, ''))
    72106
    73107def main():
    74     if len(sys.argv) != 4:
    75         print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]
    76         sys.exit(1)
    77 
    78     kmapf = open(sys.argv[1],'r')
    79     obmapf = open(sys.argv[2],'r')
    80     out = open(sys.argv[3],'w')
    81     generate(kmapf,obmapf,out)
    82     kmapf.close()
    83     obmapf.close()
    84     out.close()
     108        if (len(sys.argv) != 4):
     109                print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]
     110                return 1
     111       
     112        kmapf = open(sys.argv[1], 'r')
     113        obmapf = open(sys.argv[2], 'r')
     114        out = open(sys.argv[3], 'w')
     115       
     116        generate(kmapf, obmapf, out)
     117       
     118        kmapf.close()
     119        obmapf.close()
     120        out.close()
    85121
    86122if __name__ == '__main__':
    87     main()
     123        sys.exit(main())
Note: See TracChangeset for help on using the changeset viewer.