Home | History | Annotate | Download | only in find_runtime_symbols
      1 #!/usr/bin/env python
      2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 """Reduces result of 'readelf -wL' to just a list of starting addresses.
      6 
      7 It lists up all addresses where the corresponding source files change.  The
      8 list is sorted in ascending order.  See tests/reduce_debugline_test.py for
      9 examples.
     10 
     11 This script assumes that the result of 'readelf -wL' ends with an empty line.
     12 
     13 Note: the option '-wL' has the same meaning with '--debug-dump=decodedline'.
     14 """
     15 
     16 import re
     17 import sys
     18 
     19 
     20 _FILENAME_PATTERN = re.compile('(CU: |)(.+)\:')
     21 
     22 
     23 def reduce_decoded_debugline(input_file):
     24   filename = ''
     25   starting_dict = {}
     26   started = False
     27 
     28   for line in input_file:
     29     line = line.strip()
     30     unpacked = line.split(None, 2)
     31 
     32     if len(unpacked) == 3 and unpacked[2].startswith('0x'):
     33       if not started and filename:
     34         started = True
     35         starting_dict[int(unpacked[2], 16)] = filename
     36     else:
     37       started = False
     38       if line.endswith(':'):
     39         matched = _FILENAME_PATTERN.match(line)
     40         if matched:
     41           filename = matched.group(2)
     42 
     43   starting_list = []
     44   prev_filename = ''
     45   for address in sorted(starting_dict):
     46     curr_filename = starting_dict[address]
     47     if prev_filename != curr_filename:
     48       starting_list.append((address, starting_dict[address]))
     49     prev_filename = curr_filename
     50   return starting_list
     51 
     52 
     53 def main():
     54   if len(sys.argv) != 1:
     55     print >> sys.stderr, 'Unsupported arguments'
     56     return 1
     57 
     58   starting_list = reduce_decoded_debugline(sys.stdin)
     59   bits64 = starting_list[-1][0] > 0xffffffff
     60   for address, filename in starting_list:
     61     if bits64:
     62       print '%016x %s' % (address, filename)
     63     else:
     64       print '%08x %s' % (address, filename)
     65 
     66 
     67 if __name__ == '__main__':
     68   sys.exit(main())
     69