Bug: http://b/20139821
Change-Id: I1c1ed1b97a75936407e996698b98b94a7175ac30
(cherry picked from commit 6cda074289)
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/python
 | 
						|
 | 
						|
import glob
 | 
						|
import os
 | 
						|
import re
 | 
						|
import string
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
 | 
						|
toolchain = os.environ['ANDROID_TOOLCHAIN']
 | 
						|
arch = re.sub(r'.*/linux-x86/([^/]+)/.*', r'\1', toolchain)
 | 
						|
 | 
						|
sys.stderr.write('Checking symbols for arch "%s"...\n' % arch)
 | 
						|
 | 
						|
def GetSymbols(library, functions_or_variables):
 | 
						|
  api = '9'
 | 
						|
  if library == 'libm' and arch == 'arm':
 | 
						|
    api = '3'
 | 
						|
  path = '%s/development/ndk/platforms/android-%s/arch-%s/symbols/%s.so.%s.txt' % (os.environ['ANDROID_BUILD_TOP'], api, arch, library, functions_or_variables)
 | 
						|
  symbols = set()
 | 
						|
  for line in open(path, 'r'):
 | 
						|
    symbols.add(line.rstrip())
 | 
						|
  #sys.stdout.write('%d %s in %s for %s\n' % (len(symbols), functions_or_variables, library, arch))
 | 
						|
  return symbols
 | 
						|
 | 
						|
def CheckSymbols(library, functions_or_variables):
 | 
						|
  expected_symbols = GetSymbols(library, functions_or_variables)
 | 
						|
 | 
						|
  so_file = '%s/system/lib/%s.so' % (os.environ['ANDROID_PRODUCT_OUT'], library)
 | 
						|
 | 
						|
  # Example readelf output:
 | 
						|
  #   264: 0001623c     4 FUNC    GLOBAL DEFAULT    8 cabsf
 | 
						|
  #   266: 00016244     4 FUNC    GLOBAL DEFAULT    8 dremf
 | 
						|
  #   267: 00019018     4 OBJECT  GLOBAL DEFAULT   11 __fe_dfl_env
 | 
						|
  #   268: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_dcmplt
 | 
						|
 | 
						|
 | 
						|
  r = re.compile(r' +\d+: [0-9a-f]+ +\d+ (FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)')
 | 
						|
 | 
						|
  actual_symbols = set()
 | 
						|
  for line in subprocess.check_output(['readelf', '--dyn-syms', so_file]).split('\n'):
 | 
						|
    m = r.match(line)
 | 
						|
    if m:
 | 
						|
      symbol = string.split(m.group(2), '@')[0]
 | 
						|
      if m.group(1) == 'FUNC' and functions_or_variables == 'functions':
 | 
						|
        actual_symbols.add(symbol)
 | 
						|
      elif m.group(1) == 'OBJECT' and functions_or_variables == 'variables':
 | 
						|
        actual_symbols.add(symbol)
 | 
						|
    #else:
 | 
						|
      #print 'ignoring: ' % line
 | 
						|
 | 
						|
  missing = expected_symbols - actual_symbols
 | 
						|
  if len(missing) > 0:
 | 
						|
    sys.stderr.write('%d missing %s in %s for %s:\n' % (len(missing), functions_or_variables, library, arch))
 | 
						|
    for miss in sorted(missing):
 | 
						|
      sys.stderr.write('  %s\n' % miss)
 | 
						|
 | 
						|
  return len(missing) == 0
 | 
						|
 | 
						|
CheckSymbols("libc", "functions")
 | 
						|
CheckSymbols("libc", "variables")
 | 
						|
CheckSymbols("libm", "functions")
 | 
						|
CheckSymbols("libm", "variables")
 | 
						|
 | 
						|
sys.exit(0)
 |