Path: blob/main_old/android/compress_symbols.py
1693 views
#!/usr/bin/env python1# Copyright 2018 The ANGLE Project Authors. All rights reserved.2# Use of this source code is governed by a BSD-style license that can be3# found in the LICENSE file.45# Generate library file with compressed symbols per Android build6# process.7# https://www.ece.villanova.edu/VECR/doc/gdb/MiniDebugInfo.html89import argparse10import subprocess11import sys121314def main():15parser = argparse.ArgumentParser(description=__doc__)16parser.add_argument(17'--objcopy', required=True, help='The objcopy binary to run', metavar='PATH')18parser.add_argument('--nm', required=True, help='The nm binary to run', metavar='PATH')19parser.add_argument('--strip', required=True, help='The strip binary to run', metavar='PATH')20parser.add_argument(21'--output', required=True, help='Final output shared object file', metavar='FILE')22parser.add_argument(23'--unstrippedsofile',24required=True,25help='Unstripped shared object file produced by linking command',26metavar='FILE')27args = parser.parse_args()2829copy_cmd = ["cp", args.unstrippedsofile, args.output]30result = subprocess.call(copy_cmd)3132nm_cmd = subprocess.Popen([args.nm, '-D', args.output, '--format=posix', '--defined-only'],33stdout=subprocess.PIPE)3435awk_cmd = subprocess.Popen(['awk', '{ print $1}'], stdin=nm_cmd.stdout, stdout=subprocess.PIPE)3637dynsym_out = open(args.output + '.dynsyms', 'w')38sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=dynsym_out)39sort_cmd.wait()40dynsym_out.close()4142funcsyms_out = open(args.output + '.funcsyms', 'w')43nm_cmd = subprocess.Popen([args.nm, args.output, '--format=posix', '--defined-only'],44stdout=subprocess.PIPE)4546awk_cmd = subprocess.Popen(['awk', '{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 }'],47stdin=nm_cmd.stdout,48stdout=subprocess.PIPE)4950sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=funcsyms_out)51sort_cmd.wait()52funcsyms_out.close()5354keep_symbols = open(args.output + '.keep_symbols', 'w')55comm_cmd = subprocess.Popen(56['comm', '-13', args.output + '.dynsyms', args.output + '.funcsyms'], stdout=keep_symbols)57comm_cmd.wait()5859# Ensure that the keep_symbols file is not empty.60keep_symbols.write("\n")61keep_symbols.close()6263objcopy_cmd = [args.objcopy, '--only-keep-debug', args.output, args.output + '.debug']64subprocess.check_call(objcopy_cmd)6566objcopy_cmd = [67args.objcopy, '-S', '--remove-section', '.gdb_index', '--remove-section', '.comment',68'--keep-symbols', args.output + '.keep_symbols', args.output + '.debug',69args.output + '.mini_debuginfo'70]71subprocess.check_call(objcopy_cmd)7273strip_cmd = [args.strip, '--strip-all', '-R', '.comment', args.output]74subprocess.check_call(strip_cmd)7576xz_cmd = ['xz', '-f', args.output + '.mini_debuginfo']77subprocess.check_call(xz_cmd)7879objcopy_cmd = [80args.objcopy, '--add-section', '.gnu_debugdata=' + args.output + '.mini_debuginfo.xz',81args.output82]83subprocess.check_call(objcopy_cmd)8485# Clean out scratch files86rm_cmd = [87'rm', '-f', args.output + '.dynsyms', args.output + '.funcsyms',88args.output + '.keep_symbols', args.output + '.debug', args.output + '.mini_debuginfo',89args.output + '.mini_debuginfo.xz'90]91result = subprocess.call(rm_cmd)9293return result949596if __name__ == "__main__":97sys.exit(main())9899100