blob: 613aa88eea50f1d4ccec7d2602f6e550fb004c6a [file] [log] [blame]
Elliott Hughes6b586e72021-04-15 13:39:08 -07001#!/usr/bin/env python3
Dan Albert169eb662015-01-21 16:42:02 -08002#
3# Copyright (C) 2015 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the 'License');
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an 'AS IS' BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17# pylint: disable=bad-indentation,bad-continuation
Elliott Hughes5a93e882014-05-16 14:44:38 -070018import glob
19import os
20import re
Elliott Hughes5a93e882014-05-16 14:44:38 -070021import sys
22
Dan Albert169eb662015-01-21 16:42:02 -080023import symbols
24
Dan Albert76212ee2014-08-13 13:04:28 -070025only_unwanted = False
26if len(sys.argv) > 1:
27 if sys.argv[1] in ('-u', '--unwanted'):
28 only_unwanted = True
29
Elliott Hughes5a93e882014-05-16 14:44:38 -070030toolchain = os.environ['ANDROID_TOOLCHAIN']
31arch = re.sub(r'.*/linux-x86/([^/]+)/.*', r'\1', toolchain)
Dan Albert76212ee2014-08-13 13:04:28 -070032if arch == 'aarch64':
33 arch = 'arm64'
Elliott Hughes5a93e882014-05-16 14:44:38 -070034
Elliott Hughese8e45342014-06-13 11:50:07 -070035def MangleGlibcNameToBionic(name):
36 if name in glibc_to_bionic_names:
37 return glibc_to_bionic_names[name]
38 return name
39
Dan Albert169eb662015-01-21 16:42:02 -080040def GetNdkIgnored(arch): # pylint: disable=redefined-outer-name
41 ignored_symbols = set()
Dan Albert76212ee2014-08-13 13:04:28 -070042 files = glob.glob('%s/ndk/build/tools/unwanted-symbols/%s/*' %
43 (os.getenv('ANDROID_BUILD_TOP'), arch))
44 for f in files:
Dan Albert169eb662015-01-21 16:42:02 -080045 ignored_symbols |= set(open(f, 'r').read().splitlines())
46 return ignored_symbols
Dan Albert76212ee2014-08-13 13:04:28 -070047
Elliott Hughese8e45342014-06-13 11:50:07 -070048glibc_to_bionic_names = {
49 '__res_init': 'res_init',
50 '__res_mkquery': 'res_mkquery',
51 '__res_query': 'res_query',
52 '__res_search': 'res_search',
Dan Albert2320b022014-08-21 11:36:07 -070053 '__xpg_basename': '__gnu_basename',
Elliott Hughese8e45342014-06-13 11:50:07 -070054}
55
Dan Albert169eb662015-01-21 16:42:02 -080056glibc = symbols.GetFromSystemSo([
57 'libc.so.*',
58 'librt.so.*',
59 'libpthread.so.*',
60 'libresolv.so.*',
61 'libm.so.*',
62 'libutil.so.*',
63])
64
65bionic = symbols.GetFromAndroidSo(['libc.so', 'libm.so'])
66this_dir = os.path.dirname(os.path.realpath(__file__))
67posix = symbols.GetFromTxt(os.path.join(this_dir, 'posix-2013.txt'))
68ndk_ignored = GetNdkIgnored(arch)
Elliott Hughes5a93e882014-05-16 14:44:38 -070069
Elliott Hughes03932212014-12-04 11:24:48 -080070glibc = set(map(MangleGlibcNameToBionic, glibc))
Elliott Hughese8e45342014-06-13 11:50:07 -070071
Elliott Hughes5a93e882014-05-16 14:44:38 -070072# bionic includes various BSD symbols to ease porting other BSD-licensed code.
73bsd_stuff = set([
Elliott Hughesd07c4432016-01-15 19:54:31 -080074 'arc4random',
75 'arc4random_buf',
76 'arc4random_uniform',
Elliott Hughes45bf4c32014-05-22 18:53:21 -070077 'basename_r',
78 'dirname_r',
79 'fgetln',
80 'fpurge',
81 'funopen',
Elliott Hughesf226ee52016-02-03 11:24:28 -080082 'funopen64',
Elliott Hughes45bf4c32014-05-22 18:53:21 -070083 'gamma_r',
84 'gammaf_r',
Elliott Hughes5a93e882014-05-16 14:44:38 -070085 'getprogname',
86 'setprogname',
87 'strlcat',
88 'strlcpy',
Elliott Hughes45bf4c32014-05-22 18:53:21 -070089 'sys_signame',
Elliott Hughes5a93e882014-05-16 14:44:38 -070090 'wcslcat',
Elliott Hughes2adde7b2016-05-06 15:44:26 -070091 'wcslcpy',
Elliott Hughes5a93e882014-05-16 14:44:38 -070092])
93# Some symbols are part of the FORTIFY implementation.
94FORTIFY_stuff = set([
95 '__FD_CLR_chk',
96 '__FD_ISSET_chk',
97 '__FD_SET_chk',
Elliott Hughesd07c4432016-01-15 19:54:31 -080098 '__fwrite_chk',
99 '__memchr_chk',
100 '__memrchr_chk',
101 '__pwrite64_chk',
102 '__pwrite_chk',
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700103 '__sendto_chk',
Elliott Hughes5a93e882014-05-16 14:44:38 -0700104 '__stack_chk_guard',
105 '__stpncpy_chk2',
106 '__strchr_chk',
107 '__strlcat_chk',
108 '__strlcpy_chk',
109 '__strlen_chk',
110 '__strncpy_chk2',
111 '__strrchr_chk',
Elliott Hughes21788262016-05-06 14:43:50 -0700112 '__umask_chk',
Elliott Hughesd07c4432016-01-15 19:54:31 -0800113 '__write_chk',
Elliott Hughes5a93e882014-05-16 14:44:38 -0700114])
Elliott Hughes21788262016-05-06 14:43:50 -0700115# Some symbols are used to implement public functions/macros.
Elliott Hughesb497c432014-05-20 20:37:56 -0700116macro_stuff = set([
117 '__assert2',
118 '__errno',
119 '__fe_dfl_env',
120 '__get_h_errno',
Elliott Hughes21788262016-05-06 14:43:50 -0700121 '__gnu_strerror_r',
Dan Albert76212ee2014-08-13 13:04:28 -0700122 '__fpclassifyd',
123 '__isfinite',
124 '__isfinitef',
125 '__isfinitel',
126 '__isnormal',
127 '__isnormalf',
128 '__isnormall',
129 '__sF',
130 '__pthread_cleanup_pop',
131 '__pthread_cleanup_push',
Elliott Hughesb497c432014-05-20 20:37:56 -0700132])
Elliott Hughes5a93e882014-05-16 14:44:38 -0700133# bionic exposes various Linux features that glibc doesn't.
134linux_stuff = set([
135 'getauxval',
136 'gettid',
Elliott Hughes21788262016-05-06 14:43:50 -0700137 'pthread_gettid_np',
138 'tgkill',
Elliott Hughes5a93e882014-05-16 14:44:38 -0700139])
140# Some standard stuff isn't yet in the versions of glibc we're using.
141std_stuff = set([
Elliott Hughesf6b1d432014-06-06 15:20:50 -0700142 'at_quick_exit',
143 'c16rtomb',
144 'c32rtomb',
145 'mbrtoc16',
146 'mbrtoc32',
Elliott Hughes5a93e882014-05-16 14:44:38 -0700147])
148# These have mangled names in glibc, with a macro taking the "obvious" name.
149weird_stuff = set([
150 'fstat',
151 'fstat64',
152 'fstatat',
153 'fstatat64',
154 'isfinite',
155 'isfinitef',
156 'isfinitel',
157 'isnormal',
158 'isnormalf',
159 'isnormall',
160 'lstat',
161 'lstat64',
162 'mknod',
163 'mknodat',
164 'stat',
165 'stat64',
Dan Albert76212ee2014-08-13 13:04:28 -0700166 'optreset',
167 'sigsetjmp',
168])
169# These exist in glibc, but under slightly different names (generally one extra
170# or one fewer _). TODO: check against glibc names.
171libresolv_stuff = set([
172 '__res_send_setqhook',
173 '__res_send_setrhook',
Elliott Hughes21788262016-05-06 14:43:50 -0700174 '_resolv_delete_cache_for_net',
Dan Albert76212ee2014-08-13 13:04:28 -0700175 '_resolv_flush_cache_for_net',
176 '_resolv_set_nameservers_for_net',
177 'dn_expand',
178 'nsdispatch',
179])
Dan Albert76212ee2014-08-13 13:04:28 -0700180# Implementation details we know we export (and can't get away from).
181known = set([
182 '_ctype_',
183 '__libc_init',
Elliott Hughes5a93e882014-05-16 14:44:38 -0700184])
Elliott Hughescf346532020-07-31 10:35:03 -0700185# POSIX has some stuff that's unusable in the modern world (a64l) or not
186# actually implemented in glibc unless you count always failing with ENOSYS
187# as being implemented (fattach). Other stuff (fmtmsg) isn't used in any
Elliott Hughes01a57d12017-10-18 14:00:13 -0700188# codebase I have access to, internal or external.
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700189in_posix_and_glibc_but_dead_or_useless = set([
190 'a64l', # obsolete
191 'confstr', # obsolete
Elliott Hughesd036a8d2017-10-12 20:32:22 -0700192 'endutxent', # no utmp on Android
Elliott Hughes90e3f442017-10-19 21:52:51 -0700193 'fattach', # <stropts.h> marked obsolescent
194 'fdetach', # <stropts.h> marked obsolescent
Elliott Hughes01a57d12017-10-18 14:00:13 -0700195 'fmtmsg', # unused
196 'getdate', # unused
197 'getdate_err', # unused
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700198 'gethostid', # obsolete
Elliott Hughes90e3f442017-10-19 21:52:51 -0700199 'getmsg', # <stropts.h> marked obsolescent
200 'getpmsg', # <stropts.h> marked obsolescent
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700201 'getutxent', # no utmp on Android
202 'getutxid', # no utmp on Android
203 'getutxline', # no utmp on Android
Elliott Hughes90e3f442017-10-19 21:52:51 -0700204 'isastream', # <stropts.h> marked obsolescent
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700205 'l64a', # obsolete
206 'mq_close', # disallowed by SELinux
207 'mq_getattr', # disallowed by SELinux
208 'mq_notify', # disallowed by SELinux
209 'mq_open', # disallowed by SELinux
210 'mq_receive', # disallowed by SELinux
211 'mq_send', # disallowed by SELinux
212 'mq_setattr', # disallowed by SELinux
213 'mq_timedreceive', # disallowed by SELinux
214 'mq_timedsend', # disallowed by SELinux
215 'mq_unlink', # disallowed by SELinux
Elliott Hughes62446272017-10-13 10:21:37 -0700216 'pthread_getconcurrency', # marked obsolescent
217 'pthread_setconcurrency', # marked obsolescent
Elliott Hughes90e3f442017-10-19 21:52:51 -0700218 'putmsg', # <stropts.h> marked obsolescent
219 'putpmsg', # <stropts.h> marked obsolescent
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700220 'pututxline', # no utmp on Android
221 'shm_open', # disallowed by SELinux
222 'shm_unlink', # disallowed by SELinux
223 'setutxent', # no utmp on Android
Elliott Hughes61c9c802017-10-19 14:54:05 -0700224 'sockatmark', # obsolete (https://tools.ietf.org/html/rfc6093)
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700225 'strfmon', # icu4c
226 'strfmon_l', # icu4c
Elliott Hughes90e3f442017-10-19 21:52:51 -0700227 'ulimit', # <ulimit.h> marked obsolescent
Elliott Hughes187d37d2016-04-06 13:29:22 -0700228])
229
Elliott Hughes0bfcbaf2017-08-28 09:18:34 -0700230posix = posix - in_posix_and_glibc_but_dead_or_useless
231glibc = glibc - in_posix_and_glibc_but_dead_or_useless
Elliott Hughes5a93e882014-05-16 14:44:38 -0700232
Dan Albert76212ee2014-08-13 13:04:28 -0700233if not only_unwanted:
Elliott Hughes6b586e72021-04-15 13:39:08 -0700234 #print('glibc:')
Elliott Hughes03932212014-12-04 11:24:48 -0800235 #for symbol in sorted(glibc):
Elliott Hughes6b586e72021-04-15 13:39:08 -0700236 # print(symbol)
237 #print()
Elliott Hughes5a93e882014-05-16 14:44:38 -0700238
Elliott Hughes6b586e72021-04-15 13:39:08 -0700239 #print('bionic:')
Elliott Hughes03932212014-12-04 11:24:48 -0800240 #for symbol in sorted(bionic):
Elliott Hughes6b586e72021-04-15 13:39:08 -0700241 # print(symbol)
242 #print()
Elliott Hughes5a93e882014-05-16 14:44:38 -0700243
Elliott Hughes6b586e72021-04-15 13:39:08 -0700244 print('in glibc (but not posix) but not bionic:')
Elliott Hughes03932212014-12-04 11:24:48 -0800245 for symbol in sorted((glibc - posix).difference(bionic)):
Elliott Hughes6b586e72021-04-15 13:39:08 -0700246 print(symbol)
247 print()
Elliott Hughes03932212014-12-04 11:24:48 -0800248
Elliott Hughes6b586e72021-04-15 13:39:08 -0700249 print('in posix (and implemented in glibc) but not bionic:')
Elliott Hughes03932212014-12-04 11:24:48 -0800250 for symbol in sorted((posix.intersection(glibc)).difference(bionic)):
Elliott Hughes6b586e72021-04-15 13:39:08 -0700251 print(symbol)
252 print()
Elliott Hughes03932212014-12-04 11:24:48 -0800253
Elliott Hughes6b586e72021-04-15 13:39:08 -0700254 print('in bionic but not glibc:')
Dan Albert76212ee2014-08-13 13:04:28 -0700255
256allowed_stuff = (bsd_stuff | FORTIFY_stuff | linux_stuff | macro_stuff |
Dan Albertfd5ee9a2014-08-15 14:20:04 -0700257 std_stuff | weird_stuff | libresolv_stuff | known)
Elliott Hughesb497c432014-05-20 20:37:56 -0700258for symbol in sorted((bionic - allowed_stuff).difference(glibc)):
Dan Albert76212ee2014-08-13 13:04:28 -0700259 if symbol in ndk_ignored:
260 symbol += '*'
Elliott Hughes6b586e72021-04-15 13:39:08 -0700261 print(symbol)
Elliott Hughes5a93e882014-05-16 14:44:38 -0700262
263sys.exit(0)