xref: /aosp_15_r20/bionic/libc/tools/symbols.py (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
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