Index: tools/find_runtime_symbols/prepare_symbol_info.py |
diff --git a/tools/find_runtime_symbols/prepare_symbol_info.py b/tools/find_runtime_symbols/prepare_symbol_info.py |
index 57fcfbc3a83d046641379504c93727c61113b911..50654b1a74b9234c2f01b78c6559a5478416b16b 100755 |
--- a/tools/find_runtime_symbols/prepare_symbol_info.py |
+++ b/tools/find_runtime_symbols/prepare_symbol_info.py |
@@ -16,6 +16,39 @@ from parse_proc_maps import parse_proc_maps |
from util import executable_condition |
+def _dump_command_result(command, output_dir_path, basename, suffix, log): |
+ handle_out, filename_out = tempfile.mkstemp( |
+ suffix=suffix, prefix=basename + '.', dir=output_dir_path) |
+ handle_err, filename_err = tempfile.mkstemp( |
+ suffix=suffix + '.err', prefix=basename + '.', dir=output_dir_path) |
+ error = False |
+ try: |
+ subprocess.check_call( |
+ command, stdout=handle_out, stderr=handle_err, shell=True) |
+ except: |
+ error = True |
+ finally: |
+ os.close(handle_err) |
+ os.close(handle_out) |
+ |
+ if os.path.exists(filename_err): |
+ if log.getEffectiveLevel() <= logging.DEBUG: |
+ with open(filename_err, 'r') as f: |
+ for line in f: |
+ log.debug(line.rstrip()) |
+ os.remove(filename_err) |
+ |
+ if os.path.exists(filename_out) and ( |
+ os.path.getsize(filename_out) == 0 or error): |
+ os.remove(filename_out) |
+ return None |
+ |
+ if not os.path.exists(filename_out): |
+ return None |
+ |
+ return filename_out |
+ |
+ |
def prepare_symbol_info(maps_path, output_dir_path=None, loglevel=logging.WARN): |
log = logging.getLogger('prepare_symbol_info') |
log.setLevel(loglevel) |
@@ -58,42 +91,31 @@ def prepare_symbol_info(maps_path, output_dir_path=None, loglevel=logging.WARN): |
maps = parse_proc_maps(f) |
log.debug('Listing up symbols.') |
- nm_files = {} |
+ files = {} |
for entry in maps.iter(executable_condition): |
log.debug(' %016x-%016x +%06x %s' % ( |
entry.begin, entry.end, entry.offset, entry.name)) |
- with tempfile.NamedTemporaryFile( |
- prefix=os.path.basename(entry.name) + '.', |
- suffix='.nm', delete=False, mode='w', dir=output_dir_path) as f: |
- nm_filename = os.path.realpath(f.name) |
- nm_succeeded = False |
- cppfilt_succeeded = False |
- p_nm = subprocess.Popen( |
- 'nm -n --format bsd %s' % entry.name, shell=True, |
- stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
- p_cppfilt = subprocess.Popen( |
- 'c++filt', shell=True, |
- stdin=p_nm.stdout, stdout=f, stderr=subprocess.PIPE) |
- |
- if p_nm.wait() == 0: |
- nm_succeeded = True |
- for line in p_nm.stderr: |
- log.debug(line.rstrip()) |
- if p_cppfilt.wait() == 0: |
- cppfilt_succeeded = True |
- for line in p_cppfilt.stderr: |
- log.debug(line.rstrip()) |
- |
- if nm_succeeded and cppfilt_succeeded: |
- nm_files[entry.name] = { |
+ nm_filename = _dump_command_result( |
+ 'nm -n --format bsd %s | c++filt' % entry.name, |
+ output_dir_path, os.path.basename(entry.name), '.nm', log) |
+ if not nm_filename: |
+ continue |
+ readelf_e_filename = _dump_command_result( |
+ 'readelf -e %s' % entry.name, |
+ output_dir_path, os.path.basename(entry.name), '.readelf-e', log) |
+ if not readelf_e_filename: |
+ continue |
+ |
+ files[entry.name] = {} |
+ files[entry.name]['nm'] = { |
'file': os.path.basename(nm_filename), |
'format': 'bsd', |
'mangled': False} |
- else: |
- os.remove(nm_filename) |
+ files[entry.name]['readelf-e'] = { |
+ 'file': os.path.basename(readelf_e_filename)} |
- with open(os.path.join(output_dir_path, 'nm.json'), 'w') as f: |
- json.dump(nm_files, f, indent=2, sort_keys=True) |
+ with open(os.path.join(output_dir_path, 'files.json'), 'w') as f: |
+ json.dump(files, f, indent=2, sort_keys=True) |
log.info('Collected symbol information at "%s".' % output_dir_path) |
return 0 |
@@ -110,7 +132,7 @@ def main(): |
""" % sys.argv[0]) |
return 1 |
elif len(sys.argv) == 2: |
- sys.exit(prepare_symbol_info(sys.argv[1], loglevel=logging.DEBUG)) |
+ sys.exit(prepare_symbol_info(sys.argv[1], loglevel=logging.INFO)) |
else: |
sys.exit(prepare_symbol_info(sys.argv[1], sys.argv[2], |
loglevel=logging.INFO)) |