1*8d67ca89SAndroid Build Coastguard Worker# 2*8d67ca89SAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project 3*8d67ca89SAndroid Build Coastguard Worker# 4*8d67ca89SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the 'License'); 5*8d67ca89SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*8d67ca89SAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*8d67ca89SAndroid Build Coastguard Worker# 8*8d67ca89SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*8d67ca89SAndroid Build Coastguard Worker# 10*8d67ca89SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*8d67ca89SAndroid Build Coastguard Worker# distributed under the License is distributed on an 'AS IS' BASIS, 12*8d67ca89SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*8d67ca89SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*8d67ca89SAndroid Build Coastguard Worker# limitations under the License. 15*8d67ca89SAndroid Build Coastguard Worker# 16*8d67ca89SAndroid Build Coastguard Workerimport glob 17*8d67ca89SAndroid Build Coastguard Workerimport os 18*8d67ca89SAndroid Build Coastguard Workerimport re 19*8d67ca89SAndroid Build Coastguard Workerimport subprocess 20*8d67ca89SAndroid Build Coastguard Worker 21*8d67ca89SAndroid Build Coastguard Worker 22*8d67ca89SAndroid Build Coastguard Workerdef GetFromTxt(txt_file): 23*8d67ca89SAndroid Build Coastguard Worker symbols = set() 24*8d67ca89SAndroid Build Coastguard Worker f = open(txt_file, 'r') 25*8d67ca89SAndroid Build Coastguard Worker for line in f.read().splitlines(): 26*8d67ca89SAndroid Build Coastguard Worker symbols.add(line) 27*8d67ca89SAndroid Build Coastguard Worker f.close() 28*8d67ca89SAndroid Build Coastguard Worker return symbols 29*8d67ca89SAndroid Build Coastguard Worker 30*8d67ca89SAndroid Build Coastguard Worker 31*8d67ca89SAndroid Build Coastguard Workerdef GetFromElf(elf_file, sym_type='--dyn-syms'): 32*8d67ca89SAndroid Build Coastguard Worker # pylint: disable=line-too-long 33*8d67ca89SAndroid Build Coastguard Worker # Example readelf output: 34*8d67ca89SAndroid Build Coastguard Worker # 264: 0001623c 4 FUNC GLOBAL DEFAULT 8 cabsf 35*8d67ca89SAndroid Build Coastguard Worker # 266: 00016244 4 FUNC GLOBAL DEFAULT 8 dremf 36*8d67ca89SAndroid Build Coastguard Worker # 267: 00019018 4 OBJECT GLOBAL DEFAULT 11 __fe_dfl_env 37*8d67ca89SAndroid Build Coastguard Worker # 268: 00000000 0 FUNC GLOBAL DEFAULT UND __aeabi_dcmplt 38*8d67ca89SAndroid Build Coastguard Worker 39*8d67ca89SAndroid Build Coastguard Worker r = re.compile( 40*8d67ca89SAndroid Build Coastguard Worker r' +\d+: [0-9a-f]+ +\d+ (I?FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)') 41*8d67ca89SAndroid Build Coastguard Worker 42*8d67ca89SAndroid Build Coastguard Worker symbols = set() 43*8d67ca89SAndroid Build Coastguard Worker 44*8d67ca89SAndroid Build Coastguard Worker output = subprocess.check_output(['readelf', sym_type, '-W', elf_file], 45*8d67ca89SAndroid Build Coastguard Worker text=True) 46*8d67ca89SAndroid Build Coastguard Worker for line in output.split('\n'): 47*8d67ca89SAndroid Build Coastguard Worker if ' HIDDEN ' in line or ' UND ' in line: 48*8d67ca89SAndroid Build Coastguard Worker continue 49*8d67ca89SAndroid Build Coastguard Worker m = r.match(line) 50*8d67ca89SAndroid Build Coastguard Worker if m: 51*8d67ca89SAndroid Build Coastguard Worker symbol = m.group(2) 52*8d67ca89SAndroid Build Coastguard Worker symbol = re.sub('@.*', '', symbol) 53*8d67ca89SAndroid Build Coastguard Worker symbols.add(symbol) 54*8d67ca89SAndroid Build Coastguard Worker 55*8d67ca89SAndroid Build Coastguard Worker return symbols 56*8d67ca89SAndroid Build Coastguard Worker 57*8d67ca89SAndroid Build Coastguard Worker 58*8d67ca89SAndroid Build Coastguard Workerdef GetFromAndroidStaticLib(files): 59*8d67ca89SAndroid Build Coastguard Worker out_dir = os.environ['ANDROID_PRODUCT_OUT'] 60*8d67ca89SAndroid Build Coastguard Worker lib_dir = os.path.join(out_dir, 'obj') 61*8d67ca89SAndroid Build Coastguard Worker 62*8d67ca89SAndroid Build Coastguard Worker results = set() 63*8d67ca89SAndroid Build Coastguard Worker for f in files: 64*8d67ca89SAndroid Build Coastguard Worker static_lib_dir = os.path.join( 65*8d67ca89SAndroid Build Coastguard Worker lib_dir, 66*8d67ca89SAndroid Build Coastguard Worker 'STATIC_LIBRARIES', 67*8d67ca89SAndroid Build Coastguard Worker '{}_intermediates'.format(os.path.splitext(f)[0])) 68*8d67ca89SAndroid Build Coastguard Worker results |= GetFromElf( 69*8d67ca89SAndroid Build Coastguard Worker os.path.join(static_lib_dir, f), 70*8d67ca89SAndroid Build Coastguard Worker sym_type='--syms') 71*8d67ca89SAndroid Build Coastguard Worker return results 72*8d67ca89SAndroid Build Coastguard Worker 73*8d67ca89SAndroid Build Coastguard Worker 74*8d67ca89SAndroid Build Coastguard Workerdef GetFromAndroidSo(files): 75*8d67ca89SAndroid Build Coastguard Worker out_dir = os.environ['ANDROID_PRODUCT_OUT'] 76*8d67ca89SAndroid Build Coastguard Worker lib_dir = os.path.join(out_dir, 'system/lib64') 77*8d67ca89SAndroid Build Coastguard Worker if not os.path.isdir(lib_dir): 78*8d67ca89SAndroid Build Coastguard Worker lib_dir = os.path.join(out_dir, 'system/lib') 79*8d67ca89SAndroid Build Coastguard Worker 80*8d67ca89SAndroid Build Coastguard Worker lib_dir = os.path.join(out_dir, 'apex/com.android.runtime/lib64/bionic/') 81*8d67ca89SAndroid Build Coastguard Worker if not os.path.isdir(lib_dir): 82*8d67ca89SAndroid Build Coastguard Worker lib_dir = os.path.join(out_dir, 'apex/com.android.runtime/lib/bionic/') 83*8d67ca89SAndroid Build Coastguard Worker 84*8d67ca89SAndroid Build Coastguard Worker results = set() 85*8d67ca89SAndroid Build Coastguard Worker for f in files: 86*8d67ca89SAndroid Build Coastguard Worker results |= GetFromElf(os.path.join(lib_dir, f)) 87*8d67ca89SAndroid Build Coastguard Worker return results 88*8d67ca89SAndroid Build Coastguard Worker 89*8d67ca89SAndroid Build Coastguard Worker 90*8d67ca89SAndroid Build Coastguard Workerdef GetFromSystemSo(files): 91*8d67ca89SAndroid Build Coastguard Worker lib_dir = '/lib/x86_64-linux-gnu' 92*8d67ca89SAndroid Build Coastguard Worker results = set() 93*8d67ca89SAndroid Build Coastguard Worker for f in files: 94*8d67ca89SAndroid Build Coastguard Worker results |= GetFromElf(glob.glob(os.path.join(lib_dir, f))[-1]) 95*8d67ca89SAndroid Build Coastguard Worker return results 96