65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
|
#!/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)
|