diff options
Diffstat (limited to 'libc/tools/symbols.py')
-rw-r--r-- | libc/tools/symbols.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/libc/tools/symbols.py b/libc/tools/symbols.py new file mode 100644 index 0000000..3f40aad --- /dev/null +++ b/libc/tools/symbols.py @@ -0,0 +1,90 @@ +# +# 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 |