Index: tools/binary_size/run_binary_size_analysis.py |
diff --git a/tools/binary_size/run_binary_size_analysis.py b/tools/binary_size/run_binary_size_analysis.py |
index 7647a22dcb69b351b429f0e6e35911dd39e1b8be..91f9cf8622585783fdbabb1beafc725654c11035 100755 |
--- a/tools/binary_size/run_binary_size_analysis.py |
+++ b/tools/binary_size/run_binary_size_analysis.py |
@@ -544,6 +544,35 @@ def _find_in_system_path(binary): |
return binary_path |
return None |
+def CheckDebugFormatSupport(library, addr2line_binary): |
+ """Kills the program if debug data is in an unsupported format. |
+ |
+ There are two common versions of the DWARF debug formats and |
+ since we are right now transitioning from DWARF2 to newer formats, |
+ it's possible to have a mix of tools that are not compatible. Detect |
+ that and abort rather than produce meaningless output.""" |
+ tool_output = subprocess.check_output([addr2line_binary, '--version']) |
+ version_re = re.compile(r'^GNU [^ ]+ .* (\d+).(\d+).*?$', re.M) |
+ parsed_output = version_re.match(tool_output) |
+ major = int(parsed_output.group(1)) |
+ minor = int(parsed_output.group(2)) |
+ supports_dwarf4 = major > 2 or major == 2 and minor > 22 |
+ |
+ if supports_dwarf4: |
+ return |
+ |
+ print('Checking version of debug information in %s.' % library) |
+ debug_info = subprocess.check_output(['readelf', '--debug-dump=info', |
+ '--dwarf-depth=1', library]) |
+ dwarf_version_re = re.compile(r'^\s+Version:\s+(\d+)$', re.M) |
+ parsed_dwarf_format_output = dwarf_version_re.search(debug_info) |
+ version = int(parsed_dwarf_format_output.group(1)) |
+ if version > 2: |
+ print('The supplied tools only support DWARF2 debug data but the binary\n' + |
+ 'uses DWARF%d. Update the tools or compile the binary\n' % version + |
+ 'with -gdwarf-2.') |
+ sys.exit(1) |
+ |
def main(): |
usage = """%prog [options] |
@@ -638,8 +667,10 @@ def main(): |
assert nm_binary, 'Unable to find nm in the path. Use --nm-binary '\ |
'to specify location.' |
- print('nm: %s' % nm_binary) |
print('addr2line: %s' % addr2line_binary) |
+ print('nm: %s' % nm_binary) |
+ |
+ CheckDebugFormatSupport(opts.library, addr2line_binary) |
symbols = GetNmSymbols(opts.nm_in, opts.nm_out, opts.library, |
opts.jobs, opts.verbose is True, |