9c3fd59b00
We know we can safely statically link `libm`, since it doesn't have any dependencies on the OS or the layout of a data type that has changed between releases (like `pthread_t`). We can safely statically link `libc_syscalls` because the user can check for and handle `ENOSYS`. Update `ndk_missing_symbols.py` to account for symbols that are in the compatibility library. Improve `symbols.py` to be able to pull symbols from a static library. Change-Id: Ifb0ede1e8b4a8f0f33865d9fed72fb8b4d443fbc
91 lines
2.6 KiB
Python
91 lines
2.6 KiB
Python
#
|
|
# Copyright (C) 2015 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the 'License');
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an 'AS IS' BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
import glob
|
|
import os
|
|
import re
|
|
import subprocess
|
|
|
|
|
|
def GetFromTxt(txt_file):
|
|
symbols = set()
|
|
f = open(txt_file, 'r')
|
|
for line in f.read().splitlines():
|
|
symbols.add(line)
|
|
f.close()
|
|
return symbols
|
|
|
|
|
|
def GetFromElf(elf_file, sym_type='--dyn-syms'):
|
|
# pylint: disable=line-too-long
|
|
# 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+ (I?FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)')
|
|
|
|
symbols = set()
|
|
|
|
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
|
|
m = r.match(line)
|
|
if m:
|
|
symbol = m.group(2)
|
|
symbol = re.sub('@.*', '', symbol)
|
|
symbols.add(symbol)
|
|
|
|
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')
|
|
if not os.path.isdir(lib_dir):
|
|
lib_dir = os.path.join(out_dir, 'system/lib')
|
|
|
|
results = set()
|
|
for f in files:
|
|
results |= GetFromElf(os.path.join(lib_dir, f))
|
|
return results
|
|
|
|
|
|
def GetFromSystemSo(files):
|
|
lib_dir = '/lib/x86_64-linux-gnu'
|
|
results = set()
|
|
for f in files:
|
|
results |= GetFromElf(glob.glob(os.path.join(lib_dir, f))[-1])
|
|
return results
|