Commit 7edc95a5 authored by Benoît Lizé's avatar Benoît Lizé Committed by Commit Bot

android: Handle no-init_array libraries in assert_static_initializers.py.

The chromium linker doesn't have static initializers, which make
assert_static_initializers.py fail. Instead of adding it to the list of
libraries that should be skipped, make sure that it has none.

Bug: 979638
Change-Id: I5450031a2e49dbfbf21d991ac6b901ddbb5c7008
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1760215Reviewed-by: default avatarSam Maier <smaier@chromium.org>
Commit-Queue: Benoit L <lizeb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#688077}
parent d759285a
......@@ -60,17 +60,23 @@ def _PrintDumpSIsCount(apk_so_name, unzipped_so, out_dir, tool_prefix):
# Mostly copied from //infra/scripts/legacy/scripts/slave/chromium/sizes.py.
def _ReadInitArray(so_path, tool_prefix):
def _ReadInitArray(so_path, tool_prefix, expect_no_initializers):
stdout = _RunReadelf(so_path, ['-SW'], tool_prefix)
# Matches: .ctors PROGBITS 000000000516add0 5169dd0 000010 00 WA 0 0 8
# Matches: .init_array INIT_ARRAY 000000000516add0 5169dd0 000010 00 WA 0 0 8
match = re.search(r'\.init_array.*$', stdout, re.MULTILINE)
if not match:
if expect_no_initializers:
if match:
raise Exception(
'Expected no initializers for %s, yet some were found' % so_path)
else:
return 0
elif not match:
raise Exception('Did not find section: .init_array in:\n' + stdout)
size_str = re.split(r'\W+', match.group(0))[5]
return int(size_str, 16)
def _CountStaticInitializers(so_path, tool_prefix):
def _CountStaticInitializers(so_path, tool_prefix, expect_no_initializers):
# Find the number of files with at least one static initializer.
# First determine if we're 32 or 64 bit
stdout = _RunReadelf(so_path, ['-h'], tool_prefix)
......@@ -84,12 +90,12 @@ def _CountStaticInitializers(so_path, tool_prefix):
# Then find the number of files with global static initializers.
# NOTE: this is very implementation-specific and makes assumptions
# about how compiler and linker implement global static initializers.
init_array_size = _ReadInitArray(so_path, tool_prefix)
init_array_size = _ReadInitArray(so_path, tool_prefix, expect_no_initializers)
return init_array_size / word_size
def _AnalyzeStaticInitializers(apk_filename, tool_prefix, dump_sis, out_dir,
ignored_libs):
ignored_libs, no_initializers_libs):
# Static initializer counting mostly copies logic in
# infra/scripts/legacy/scripts/slave/chromium/sizes.py.
with zipfile.ZipFile(apk_filename) as z:
......@@ -105,10 +111,13 @@ def _AnalyzeStaticInitializers(apk_filename, tool_prefix, dump_sis, out_dir,
si_count = 0
for f in files_to_check:
expect_no_initializers = (os.path.basename(
f.filename) in no_initializers_libs)
with tempfile.NamedTemporaryFile() as temp:
temp.write(z.read(f))
temp.flush()
si_count += _CountStaticInitializers(temp.name, tool_prefix)
si_count += _CountStaticInitializers(temp.name, tool_prefix,
expect_no_initializers)
if dump_sis:
# Print count and list of SIs reported by dump-static-initializers.py.
# Doesn't work well on all archs (particularly arm), which is why
......@@ -128,11 +137,14 @@ def main():
parser.add_argument('apk', help='APK file path.')
args = parser.parse_args()
#TODO(crbug.com/838414): add support for files included via loadable_modules.
# TODO(crbug.com/838414): add support for files included via loadable_modules.
ignored_libs = ['libarcore_sdk_c.so']
# The chromium linker doesn't have static initializers, which makes the
# regular check throw. It should not have any.
no_initializers_libs = ['libchromium_android_linker.so']
si_count = _AnalyzeStaticInitializers(args.apk, args.tool_prefix, False, '.',
ignored_libs)
ignored_libs, no_initializers_libs)
if si_count != args.expected_count:
print('Expected {} static initializers, but found {}.'.format(
args.expected_count, si_count))
......@@ -144,7 +156,7 @@ def main():
print('Dumping static initializers via dump-static-initializers.py:')
sys.stdout.flush()
_AnalyzeStaticInitializers(args.apk, args.tool_prefix, True, '.',
ignored_libs)
ignored_libs, no_initializers_libs)
print()
print('If the above list is not useful, consider listing them with:')
print(' //tools/binary_size/diagnose_bloat.py')
......
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