diff options
Diffstat (limited to 'libc/tools/check-symbols.py')
-rwxr-xr-x | libc/tools/check-symbols.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/libc/tools/check-symbols.py b/libc/tools/check-symbols.py new file mode 100755 index 000000000..09225489d --- /dev/null +++ b/libc/tools/check-symbols.py @@ -0,0 +1,64 @@ +#!/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) |