forked from memfault/puncover
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gcc_tools.py
48 lines (36 loc) · 1.83 KB
/
gcc_tools.py
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
import os
import subprocess
import itertools
class GCCTools:
def __init__(self, gcc_base_filename):
# if base filename is a directory, make sure we have the trailing slash
if os.path.isdir(gcc_base_filename):
gcc_base_filename = os.path.join(gcc_base_filename, '')
self.gcc_base_filename = gcc_base_filename
def gcc_tool_path(self, name):
path = self.gcc_base_filename + name
if not os.path.isfile(path):
raise Exception("Could not find %s" % path)
return path
def gcc_tool_lines(self, name, args, cwd=None):
proc = subprocess.Popen([self.gcc_tool_path(name)] + args, stdout=subprocess.PIPE, cwd=cwd)
return [l.decode() for l in proc.stdout.readlines()]
def get_assembly_lines(self, elf_file):
return self.gcc_tool_lines('objdump', ['-dslw', os.path.basename(elf_file)], os.path.dirname(elf_file))
def get_size_lines(self, elf_file):
# http://linux.die.net/man/1/nm
return self.gcc_tool_lines('nm', ['-Sl', os.path.basename(elf_file)], os.path.dirname(elf_file))
# See https://blog.flameeyes.eu/2010/06/c-name-demangling/ for context
#
# This solution courtesy of:
# https://stackoverflow.com/questions/6526500/c-name-mangling-library-for-python/6526814
def get_unmangled_names(self, symbol_names, chunk_size=1000):
# for very long lists we can exceed the maximum length of the command line
# so we split the names in chunks
def chunks(l):
for i in range(0, len(l), chunk_size):
yield l[i:i + chunk_size]
lines_list = [self.gcc_tool_lines('c++filt', c) for c in chunks(symbol_names)]
lines = list(itertools.chain.from_iterable(lines_list))
demangled = list(s.rstrip() for s in lines)
return dict(zip(symbol_names, demangled))