|  | #!/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: | 
|  | if m.group(1) == 'FUNC' and functions_or_variables == 'functions': | 
|  | actual_symbols.add(m.group(2)) | 
|  | elif m.group(1) == 'OBJECT' and functions_or_variables == 'variables': | 
|  | actual_symbols.add(m.group(2)) | 
|  | #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) |