Commit 73e17bf7 by Tim Van Patten Committed by Commit Bot

Android: Fix symbol compression logic

Update the logic to compress ANGLE's symbols for Android to correctly include the necessary symbols. Bug: angleproject:3448 Test: Build and install APK, verify symbols are present during crash Change-Id: Ibb995aa775d47fb9921e4ab11b956c63ac474c30 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1611750 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com>
parent af6a51e0
...@@ -1094,14 +1094,15 @@ if (!is_component_build && is_android && symbol_level != 0) { ...@@ -1094,14 +1094,15 @@ if (!is_component_build && is_android && symbol_level != 0) {
] ]
android_nm = "${android_tool_prefix}nm" android_nm = "${android_tool_prefix}nm"
android_strip = "${android_tool_prefix}strip"
args = [ args = [
"--objcopy", "--objcopy",
rebase_path(android_objcopy, root_build_dir), rebase_path(android_objcopy, root_build_dir),
"--nm", "--nm",
rebase_path(android_nm, root_build_dir), rebase_path(android_nm, root_build_dir),
"--sofile", "--strip",
"{{source}}", rebase_path(android_strip, root_build_dir),
"--unstrippedsofile", "--unstrippedsofile",
"{{source_dir}}/lib.unstripped/{{source_file_part}}", "{{source_dir}}/lib.unstripped/{{source_file_part}}",
"--output", "--output",
......
...@@ -5,10 +5,9 @@ ...@@ -5,10 +5,9 @@
# Generate library file with compressed symbols per Android build # Generate library file with compressed symbols per Android build
# process. # process.
# # https://www.ece.villanova.edu/VECR/doc/gdb/MiniDebugInfo.html
import argparse import argparse
import os
import subprocess import subprocess
import sys import sys
...@@ -18,11 +17,7 @@ def main(): ...@@ -18,11 +17,7 @@ def main():
parser.add_argument( parser.add_argument(
'--objcopy', required=True, help='The objcopy binary to run', metavar='PATH') '--objcopy', required=True, help='The objcopy binary to run', metavar='PATH')
parser.add_argument('--nm', required=True, help='The nm binary to run', metavar='PATH') parser.add_argument('--nm', required=True, help='The nm binary to run', metavar='PATH')
parser.add_argument( parser.add_argument('--strip', required=True, help='The strip binary to run', metavar='PATH')
'--sofile',
required=True,
help='Shared object file produced by linking command',
metavar='FILE')
parser.add_argument( parser.add_argument(
'--output', required=True, help='Final output shared object file', metavar='FILE') '--output', required=True, help='Final output shared object file', metavar='FILE')
parser.add_argument( parser.add_argument(
...@@ -32,65 +27,54 @@ def main(): ...@@ -32,65 +27,54 @@ def main():
metavar='FILE') metavar='FILE')
args = parser.parse_args() args = parser.parse_args()
copy_cmd = ["cp", args.sofile, args.output] copy_cmd = ["cp", args.unstrippedsofile, args.output]
result = subprocess.call(copy_cmd) result = subprocess.call(copy_cmd)
objcopy_cmd = [args.objcopy] nm_cmd = subprocess.Popen([args.nm, '-D', args.output, '--format=posix', '--defined-only'],
objcopy_cmd.append('--only-keep-debug')
objcopy_cmd.append(args.unstrippedsofile)
objcopy_cmd.append(args.output + '.debug')
result = subprocess.call(objcopy_cmd)
nm_cmd = subprocess.Popen([args.nm, args.unstrippedsofile, '--format=posix', '--defined-only'],
stdout=subprocess.PIPE) stdout=subprocess.PIPE)
awk_cmd = subprocess.Popen(['awk', '{ print $1}'], stdin=nm_cmd.stdout, stdout=subprocess.PIPE) awk_cmd = subprocess.Popen(['awk', '{ print $1}'], stdin=nm_cmd.stdout, stdout=subprocess.PIPE)
dynsym_out = open(args.output + '.dynsyms', 'w') dynsym_out = open(args.output + '.dynsyms', 'w')
sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=dynsym_out) sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=dynsym_out)
sort_cmd.wait()
dynsym_out.close() dynsym_out.close()
nm_cmd = subprocess.Popen([args.nm, args.unstrippedsofile, '--format=posix', '--defined-only'], funcsyms_out = open(args.output + '.funcsyms', 'w')
nm_cmd = subprocess.Popen([args.nm, args.output, '--format=posix', '--defined-only'],
stdout=subprocess.PIPE) stdout=subprocess.PIPE)
awk_cmd = subprocess.Popen( awk_cmd = subprocess.Popen(['awk', '{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 }'],
['awk', '{ if ($2 == "T" || $2 == "t" ||' + ' $2 == "D") print $1 }'], stdin=nm_cmd.stdout,
stdin=nm_cmd.stdout, stdout=subprocess.PIPE)
stdout=subprocess.PIPE)
funcsyms_out = open(args.output + '.funcsyms', 'w')
sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=funcsyms_out) sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=funcsyms_out)
sort_cmd.wait()
funcsyms_out.close() funcsyms_out.close()
keep_symbols = open(args.output + '.keep_symbols', 'w') keep_symbols = open(args.output + '.keep_symbols', 'w')
sort_cmd = subprocess.Popen( comm_cmd = subprocess.Popen(
['comm', '-13', args.output + '.dynsyms', args.output + '.funcsyms'], ['comm', '-13', args.output + '.dynsyms', args.output + '.funcsyms'], stdout=keep_symbols)
stdin=awk_cmd.stdout, comm_cmd.wait()
stdout=keep_symbols)
# Ensure that the keep_symbols file is not empty. # Ensure that the keep_symbols file is not empty.
keep_symbols.write("\n") keep_symbols.write("\n")
keep_symbols.close() keep_symbols.close()
objcopy_cmd = [ objcopy_cmd = [args.objcopy, '--only-keep-debug', args.output, args.output + '.debug']
args.objcopy, '--rename-section', '.debug_frame=saved_debug_frame', args.output + '.debug',
args.output + ".mini_debuginfo"
]
subprocess.check_call(objcopy_cmd) subprocess.check_call(objcopy_cmd)
objcopy_cmd = [ objcopy_cmd = [
args.objcopy, '-S', '--remove-section', '.gdb_index', '--remove-section', '.comment', args.objcopy, '-S', '--remove-section', '.gdb_index', '--remove-section', '.comment',
'--keep-symbols=' + args.output + '.keep_symbols', args.output + '.mini_debuginfo' '--keep-symbols', args.output + '.keep_symbols', args.output + '.debug',
args.output + '.mini_debuginfo'
] ]
subprocess.check_call(objcopy_cmd) subprocess.check_call(objcopy_cmd)
objcopy_cmd = [ strip_cmd = [args.strip, '--strip-all', '-R', '.comment', args.output]
args.objcopy, '--rename-section', '.saved_debug_frame=.debug_frame', subprocess.check_call(strip_cmd)
args.output + ".mini_debuginfo"
]
subprocess.check_call(objcopy_cmd)
xz_cmd = ['xz', args.output + '.mini_debuginfo'] xz_cmd = ['xz', '-f', args.output + '.mini_debuginfo']
subprocess.check_call(xz_cmd) subprocess.check_call(xz_cmd)
objcopy_cmd = [ objcopy_cmd = [
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment