summaryrefslogtreecommitdiff
path: root/tools/profiler/nm-symbolicate.py
blob: f51d7f75f5f83b2b057c14664cdf73e49d52243e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import sys, subprocess, os

def NMSymbolicate(library, addresses):
  target_tools_prefix = os.environ.get("TARGET_TOOLS_PREFIX", "")
  args = [
    target_tools_prefix + "nm", "-D", "-S", library
  ]
  nm_lines = subprocess.check_output(args).split("\n")
  symbol_table = []
  for line in nm_lines:
    pieces = line.split(" ", 4)
    if len(pieces) != 4 or pieces[2] != "T":
      continue
    start = int(pieces[0], 16)
    end = int(pieces[1], 16)
    symbol = pieces[3]
    symbol_table.append({
      "start": int(pieces[0], 16),
      "end": int(pieces[0], 16) + int(pieces[1], 16),
      "funcName": pieces[3]
    });

  for addressStr in addresses:
    address = int(addressStr, 16)
    symbolForAddress = None
    for symbol in symbol_table:
      if address >= symbol["start"] and address <= symbol["end"]:
        symbolForAddress = symbol
        break
    if symbolForAddress:
      print symbolForAddress["funcName"]
    else:
      print "??" # match addr2line
    print ":0" # no line information from nm

if len(sys.argv) > 1:
    NMSymbolicate(sys.argv[1], sys.argv[2:])
    sys.exit(0)

print "Usage: nm-symbolicate.py <library> <addresses> > merged.sym"