include $(BUILD_STATIC_LIBRARY)
# ========================================================
+# libc_ndk.a
+# Compatibility library for the NDK. This library contains
+# all the parts of libc that are safe to statically link.
+# We can't safely statically link things that can only run
+# on a certain version of the OS. Examples include
+# anything that talks to netd (a large portion of the DNS
+# code) and anything that is dependent on the layout of a
+# data structure that has changed across releases (such as
+# pthread_t).
+# ========================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libc_ndk
+LOCAL_WHOLE_STATIC_LIBRARIES := libc_syscalls libm
+LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
+
+include $(BUILD_STATIC_LIBRARY)
+
+# ========================================================
# libc_common.a
# ========================================================
adb_pull('/system/lib/libm.so', tmp_dir)
current = symbols.GetFromAndroidSo(['libc.so', 'libm.so'])
- device = (symbols.GetFromSo(os.path.join(tmp_dir, 'libc.so')) |
- symbols.GetFromSo(os.path.join(tmp_dir, 'libm.so')))
+ device = (symbols.GetFromElf(os.path.join(tmp_dir, 'libc.so')) |
+ symbols.GetFromElf(os.path.join(tmp_dir, 'libm.so')))
+ compat_lib = symbols.GetFromAndroidStaticLib(['libc_ndk.a'])
- for symbol in sorted(current - device):
+ missing_symbols = current - device
+ compat_not_covered = missing_symbols - compat_lib
+
+ for symbol in sorted(compat_not_covered):
print symbol
return symbols
-def GetFromSo(so_file):
+def GetFromElf(elf_file, sym_type='--dyn-syms'):
# pylint: disable=line-too-long
# Example readelf output:
# 264: 0001623c 4 FUNC GLOBAL DEFAULT 8 cabsf
symbols = set()
- output = subprocess.check_output(['readelf', '--dyn-syms', '-W', so_file])
+ output = subprocess.check_output(['readelf', sym_type, '-W', elf_file])
for line in output.split('\n'):
if ' HIDDEN ' in line or ' UND ' in line:
continue
return symbols
+def GetFromAndroidStaticLib(files):
+ out_dir = os.environ['ANDROID_PRODUCT_OUT']
+ lib_dir = os.path.join(out_dir, 'obj')
+
+ results = set()
+ for f in files:
+ static_lib_dir = os.path.join(
+ lib_dir,
+ 'STATIC_LIBRARIES',
+ '{}_intermediates'.format(os.path.splitext(f)[0]))
+ results |= GetFromElf(
+ os.path.join(static_lib_dir, f),
+ sym_type='--syms')
+ return results
+
+
def GetFromAndroidSo(files):
out_dir = os.environ['ANDROID_PRODUCT_OUT']
lib_dir = os.path.join(out_dir, 'system/lib64')
results = set()
for f in files:
- results |= GetFromSo(os.path.join(lib_dir, f))
+ results |= GetFromElf(os.path.join(lib_dir, f))
return results
lib_dir = '/lib/x86_64-linux-gnu'
results = set()
for f in files:
- results |= GetFromSo(glob.glob(os.path.join(lib_dir, f))[-1])
+ results |= GetFromElf(glob.glob(os.path.join(lib_dir, f))[-1])
return results