tools/profiler/nm-symbolicate.py
author Phil Ringnalda <philringnalda@gmail.com>
Mon, 07 Nov 2016 18:51:18 -0800
changeset 352431 60af44ebfa6234197ef55fad8a74c1b02f053c4e
parent 209622 ebfcfbeba792ca13ae447926c1fa8917c4b21d34
permissions -rwxr-xr-x
Backed out 3 changesets (bug 1271765) for -Werror bustage CLOSED TREE Backed out changeset 235ea1c681db (bug 1271765) Backed out changeset 02d34b18d76b (bug 1271765) Backed out changeset 088113647629 (bug 1271765)

#!/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"