]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - android-sdk/platform-bionic.git/blob - libc/tools/check-symbols-glibc.py
Merge "Revert "Temporarily expose dlmalloc_usable_size.""
[android-sdk/platform-bionic.git] / libc / tools / check-symbols-glibc.py
1 #!/usr/bin/python
3 import glob
4 import os
5 import re
6 import string
7 import subprocess
8 import sys
10 toolchain = os.environ['ANDROID_TOOLCHAIN']
11 arch = re.sub(r'.*/linux-x86/([^/]+)/.*', r'\1', toolchain)
13 def GetSymbolsFromSo(so_file):
15   # Example readelf output:
16   #   264: 0001623c     4 FUNC    GLOBAL DEFAULT    8 cabsf
17   #   266: 00016244     4 FUNC    GLOBAL DEFAULT    8 dremf
18   #   267: 00019018     4 OBJECT  GLOBAL DEFAULT   11 __fe_dfl_env
19   #   268: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_dcmplt
21   r = re.compile(r' +\d+: [0-9a-f]+ +\d+ (I?FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)')
23   symbols = set()
25   for line in subprocess.check_output(['readelf', '--dyn-syms', '-W', so_file]).split('\n'):
26      if ' HIDDEN ' in line or ' UND ' in line:
27        continue
28      m = r.match(line)
29      if m:
30        symbol = m.group(2)
31        symbol = re.sub('@.*', '', symbol)
32        symbols.add(symbol)
34   return symbols
36 def GetSymbolsFromAndroidSo(*files):
37   symbols = set()
38   for f in files:
39     symbols = symbols | GetSymbolsFromSo('%s/system/lib64/%s' % (os.environ['ANDROID_PRODUCT_OUT'], f))
40   return symbols
42 def GetSymbolsFromSystemSo(*files):
43   symbols = set()
44   for f in files:
45     f = glob.glob('/lib/x86_64-linux-gnu/%s' % f)[-1]
46     symbols = symbols | GetSymbolsFromSo(f)
47   return symbols
49 glibc = GetSymbolsFromSystemSo('libc.so.*', 'librt.so.*', 'libpthread.so.*', 'libresolv.so.*', 'libm.so.*')
50 bionic = GetSymbolsFromAndroidSo('libc.so', 'libm.so')
52 # bionic includes various BSD symbols to ease porting other BSD-licensed code.
53 bsd_stuff = set([
54   'basename_r',
55   'dirname_r',
56   'fgetln',
57   'fpurge',
58   'funopen',
59   'gamma_r',
60   'gammaf_r',
61   'getprogname',
62   'setprogname',
63   'strlcat',
64   'strlcpy',
65   'sys_signame',
66   'wcslcat',
67   'wcslcpy'
68 ])
69 # Some symbols are part of the FORTIFY implementation.
70 FORTIFY_stuff = set([
71   '__FD_CLR_chk',
72   '__FD_ISSET_chk',
73   '__FD_SET_chk',
74   '__stack_chk_guard',
75   '__stpncpy_chk2',
76   '__strchr_chk',
77   '__strlcat_chk',
78   '__strlcpy_chk',
79   '__strlen_chk',
80   '__strncpy_chk2',
81   '__strrchr_chk',
82   '__umask_chk'
83 ])
84 # Some symbols are used to implement public macros.
85 macro_stuff = set([
86   '__assert2',
87   '__errno',
88   '__fe_dfl_env',
89   '__get_h_errno',
90 ])
91 # bionic exposes various Linux features that glibc doesn't.
92 linux_stuff = set([
93   'getauxval',
94   'gettid',
95   'tgkill'
96 ])
97 # Some standard stuff isn't yet in the versions of glibc we're using.
98 std_stuff = set([
99   'at_quick_exit',
100   'c16rtomb',
101   'c32rtomb',
102   'mbrtoc16',
103   'mbrtoc32',
104 ])
105 # These have mangled names in glibc, with a macro taking the "obvious" name.
106 weird_stuff = set([
107   'fstat',
108   'fstat64',
109   'fstatat',
110   'fstatat64',
111   'isfinite',
112   'isfinitef',
113   'isfinitel',
114   'isnormal',
115   'isnormalf',
116   'isnormall',
117   'lstat',
118   'lstat64',
119   'mknod',
120   'mknodat',
121   'stat',
122   'stat64',
123 ])
125 print 'glibc:'
126 for symbol in sorted(glibc):
127   print symbol
129 print
130 print 'bionic:'
131 for symbol in sorted(bionic):
132   print symbol
134 print
135 print 'in bionic but not glibc:'
136 allowed_stuff = (bsd_stuff | FORTIFY_stuff | linux_stuff | macro_stuff | std_stuff | weird_stuff)
137 for symbol in sorted((bionic - allowed_stuff).difference(glibc)):
138   print symbol
140 sys.exit(0)