aboutsummaryrefslogtreecommitdiffstats
path: root/libc/tools/check-symbols.py
diff options
context:
space:
mode:
Diffstat (limited to 'libc/tools/check-symbols.py')
-rwxr-xr-xlibc/tools/check-symbols.py64
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)