Commit 6a15a6c4 authored by Andrew Grieve's avatar Andrew Grieve Committed by Commit Bot

SuperSize: Teach it about thin archives

"supersize archive" would crash upon encountering a .a file that was
linked as a "thin archive" (where the actual .o files are not embedded).

This fixes the tool by transforming all foo.a(bar.o) paths into their
external object paths.

Also adds main() functions for ninja_parser.py for debugging.

Bug: 830843
Change-Id: Iddc374565b8e94a4a89b2faa343256ea2d9f569e
Reviewed-on: https://chromium-review.googlesource.com/1007317
Commit-Queue: agrieve <agrieve@chromium.org>
Reviewed-by: default avatarSamuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#550141}
parent 77ad239d
......@@ -85,26 +85,28 @@ between milestones.
##### Native Symbols
1. Symbol list is Extracted from linker `.map` file.
* Map files contain some unique pieces of information compared to `nm` output,
such as `** merge strings` entries, and some unnamed symbols (which
although unnamed, contain the `.o` path).
* Map files contain some unique pieces of information compared to `nm`
output, such as `** merge strings` entries, and some unnamed symbols
(which although unnamed, contain the `.o` path).
1. `.o` files are mapped to `.cc` files by parsing `.ninja` files.
* This means that `.h` files are never listed as sources. No information about
inlined symbols is gathered.
1. Symbol aliases (when multiple symbols share an address) are collected from
debug information via `nm elf-file`.
* Aliases are created by identical code folding (linker optimization).
* This means that `.h` files are never listed as sources. No information
about inlined symbols is gathered.
1. `** merge strings` symbols are further broken down into individual string
literal symbols. This is done by reading string literals from `.o` files, and
then searching for them within the `** merge strings` sections.
1. Symbol aliases:
* Aliases have the same address and size, but report their `.pss` as
`.size / .num_aliases`.
1. `** merge strings` symbols are further broken down into individual string
literal symbols. This is done by reading string literals from `.o` files, and
then searching for them within the `** merge strings` sections.
1. "Shared symbols" are those that are owned by multiple `.o` files. These include
inline functions defined in `.h` files, and string literals that are de-duped
at link-time. Shared symbols are normally represented using one symbol alias
per path, but are sometimes collapsed into a single symbol where the path is
set to `{shared}/$SYMBOL_COUNT`. This collapsing is done only for symbols owned
by a large number of paths.
* Type 1: Different names. Caused by identical code folding.
* These are collected from debug information via `nm elf-file`.
* Type 2: Same names, different paths. Caused by inline functions defined in
`.h` files.
* These are collected by running `nm` on each `.o` file.
* Normally represented using one alias per path, but are sometimes
collapsed into a single symbol with a path of `{shared}/$SYMBOL_COUNT`.
This collapsing is done only for symbols owned by a large number of paths.
* Type 3: String literals that are de-duped at link-time.
* These are found as part of the string literal extraction process.
##### Pak Symbols
......
#!/usr/bin/env python
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Logic for reading .a files."""
from __future__ import print_function
import argparse
import logging
import os
def IsThinArchive(path):
"""Returns whether the given .a is a thin archive."""
with open(path, 'rb') as f:
return f.read(8) == '!<thin>\n'
def CreateThinObjectPath(archive_path, subpath):
"""Given the .a path and .o subpath, returns the .o path."""
# .o subpaths in thin archives are relative to the directory of the .a.
parent_path = os.path.dirname(archive_path)
return os.path.normpath(os.path.join(parent_path, subpath))
def IterArchiveChunks(path):
"""For each .o embedded in the given .a file, yields (foo.o, foo_contents)."""
# File format reference:
# https://github.com/pathscale/binutils/blob/master/gold/archive.cc
with open(path, 'rb') as f:
header = f.read(8)
is_thin = header == '!<thin>\n'
if not is_thin and header != '!<arch>\n':
raise Exception('Invalid .a: ' + path)
def read_payload(size):
ret = f.read(size)
# Entries are 2-byte aligned.
if size & 1 != 0:
f.read(1)
return ret
while True:
entry = f.read(60)
if not entry:
return
entry_name = entry[:16].rstrip()
entry_size = int(entry[48:58].rstrip())
if entry_name in ('', '/', '//', '/SYM64/'):
payload = read_payload(entry_size)
# Metadata sections we don't care about.
if entry_name == '//':
name_list = payload
continue
if entry_name[0] == '/':
# Name is specified as location in name table.
# E.g.: /123
name_offset = int(entry_name[1:])
# String table enties are delimited by \n (e.g. "browser.o/\n").
end_idx = name_list.index('\n', name_offset)
entry_name = name_list[name_offset:end_idx]
else:
# Name specified inline with spaces for padding (e.g. "browser.o/ ").
entry_name = entry_name.rstrip()
# Although entry_size exists for thin archives, no data exists in the .a.
entry_data = None if is_thin else read_payload(entry_size)
yield entry_name.rstrip('/'), entry_data
def ExpandThinArchives(paths, output_directory):
"""Expands all thin archives found in |paths| into .o paths.
Args:
paths: List of paths relative to |output_directory|.
output_directory: Output directory.
Returns:
* A new list of paths with all thin archives replaced by .o paths.
* A set of all .a paths that were thin archives.
"""
expanded_paths = []
thin_paths = set()
num_archives = 0
for path in paths:
if not path.endswith('.a'):
expanded_paths.append(path)
continue
num_archives += 1
abs_path = os.path.join(output_directory, path)
if not IsThinArchive(abs_path):
expanded_paths.append(path)
continue
thin_paths.add(path)
# Thin archive.
for subpath, _ in IterArchiveChunks(abs_path):
expanded_paths.append(CreateThinObjectPath(path, subpath))
logging.info('%d of %d .a files were thin archives',
len(thin_paths), num_archives)
return expanded_paths, thin_paths
def CreateThinObjectPath(archive_path, subpath):
parent_path = os.path.dirname(archive_path)
return os.path.normpath(os.path.join(parent_path, subpath))
def main():
parser = argparse.ArgumentParser()
parser.add_argument('ar_path')
parser.add_argument('--expand-thin', action='store_true')
parser.add_argument('--output-directory', default='.')
args = parser.parse_args()
if args.expand_thin:
expanded = ExpandThinArchives([args.ar_path], args.output_directory)[0]
print('\n'.join(expanded))
else:
for name, payload in IterArchiveChunks(args.ar_path):
print('{}: size={}'.format(name, len(payload) if payload else '<thin>'))
if __name__ == '__main__':
main()
......@@ -20,6 +20,7 @@ import tempfile
import zipfile
import apkanalyzer
import ar
import concurrent
import demangle
import describe
......@@ -35,6 +36,16 @@ sys.path.insert(1, os.path.join(path_util.SRC_ROOT, 'tools', 'grit'))
from grit.format import data_pack
# Holds computation state that is live only when an output directory exists.
_OutputDirectoryContext = collections.namedtuple('_OutputDirectoryContext', [
'elf_object_paths', # Only when elf_path is also provided.
'known_inputs', # Only when elf_path is also provided.
'output_directory',
'source_mapper',
'thin_archives',
])
# Tunable "knobs" for CreateSectionSizesAndSymbols().
class SectionSizeKnobs(object):
def __init__(self):
......@@ -190,8 +201,9 @@ def _NormalizeObjectPath(path):
# Convert ../../third_party/... -> third_party/...
path = path[6:]
if path.endswith(')'):
# Convert foo/bar.a(baz.o) -> foo/bar.a/baz.o
start_idx = path.index('(')
# Convert foo/bar.a(baz.o) -> foo/bar.a/baz.o so that hierarchical
# breakdowns consider the .o part to be a separate node.
start_idx = path.rindex('(')
path = os.path.join(path[:start_idx], path[start_idx + 1:-1])
return path
......@@ -373,17 +385,16 @@ def _AssignNmAliasPathsAndCreatePathAliases(raw_symbols, object_paths_by_name):
return ret
def _DiscoverMissedObjectPaths(raw_symbols, elf_object_paths):
def _DiscoverMissedObjectPaths(raw_symbols, known_inputs):
# Missing object paths are caused by .a files added by -l flags, which are not
# listed as explicit inputs within .ninja rules.
parsed_inputs = set(elf_object_paths)
missed_inputs = set()
for symbol in raw_symbols:
path = symbol.object_path
if path.endswith(')'):
# Convert foo/bar.a(baz.o) -> foo/bar.a
path = path[:path.index('(')]
if path and path not in parsed_inputs:
path = path[:path.rindex('(')]
if path and path not in known_inputs:
missed_inputs.add(path)
return missed_inputs
......@@ -608,9 +619,21 @@ def CreateMetadata(map_path, elf_path, apk_path, tool_prefix, output_directory):
return metadata
def _ParseElfInfo(map_path, elf_path, tool_prefix, output_directory,
track_string_literals, elf_object_paths):
"""Adds Elf section sizes and symbols."""
def _ResolveThinArchivePaths(raw_symbols, thin_archives):
"""Converts object_paths for thin archives to external .o paths."""
for symbol in raw_symbols:
object_path = symbol.object_path
if object_path.endswith(')'):
start_idx = object_path.rindex('(')
archive_path = object_path[:start_idx]
if archive_path in thin_archives:
subpath = object_path[start_idx + 1:-1]
symbol.object_path = ar.CreateThinObjectPath(archive_path, subpath)
def _ParseElfInfo(map_path, elf_path, tool_prefix, track_string_literals,
outdir_context=None):
"""Adds ELF section sizes and symbols."""
if elf_path:
# Run nm on the elf file to retrieve the list of symbol names per-address.
# This list is required because the .map file contains only a single name
......@@ -627,15 +650,19 @@ def _ParseElfInfo(map_path, elf_path, tool_prefix, output_directory,
# single path for these symbols.
# Rather than record all paths for each symbol, set the paths to be the
# common ancestor of all paths.
if output_directory:
bulk_analyzer = nm.BulkObjectFileAnalyzer(tool_prefix, output_directory)
bulk_analyzer.AnalyzePaths(elf_object_paths)
if outdir_context:
bulk_analyzer = nm.BulkObjectFileAnalyzer(
tool_prefix, outdir_context.output_directory)
bulk_analyzer.AnalyzePaths(outdir_context.elf_object_paths)
logging.info('Parsing Linker Map')
with _OpenMaybeGz(map_path) as map_file:
section_sizes, raw_symbols = (
linker_map_parser.MapFileParser().Parse(map_file))
if outdir_context and outdir_context.thin_archives:
_ResolveThinArchivePaths(raw_symbols, outdir_context.thin_archives)
if elf_path:
logging.debug('Validating section sizes')
elf_section_sizes = _SectionSizesFromElf(elf_path, tool_prefix)
......@@ -646,9 +673,11 @@ def _ParseElfInfo(map_path, elf_path, tool_prefix, output_directory,
logging.error('readelf: %r', elf_section_sizes)
sys.exit(1)
if elf_path and output_directory:
if elf_path and outdir_context:
missed_object_paths = _DiscoverMissedObjectPaths(
raw_symbols, elf_object_paths)
raw_symbols, outdir_context.known_inputs)
missed_object_paths = ar.ExpandThinArchives(
missed_object_paths, outdir_context.output_directory)[0]
bulk_analyzer.AnalyzePaths(missed_object_paths)
bulk_analyzer.SortPaths()
if track_string_literals:
......@@ -674,11 +703,12 @@ def _ParseElfInfo(map_path, elf_path, tool_prefix, output_directory,
names_by_address = elf_nm_result.get()
raw_symbols = _AddNmAliases(raw_symbols, names_by_address)
if output_directory:
if outdir_context:
object_paths_by_name = bulk_analyzer.GetSymbolNames()
logging.debug('Fetched path information for %d symbols from %d files',
len(object_paths_by_name),
len(elf_object_paths) + len(missed_object_paths))
logging.debug(
'Fetched path information for %d symbols from %d files',
len(object_paths_by_name),
len(outdir_context.elf_object_paths) + len(missed_object_paths))
# For aliases, this provides path information where there wasn't any.
logging.info('Creating aliases for symbols shared by multiple paths')
......@@ -923,22 +953,42 @@ def CreateSectionSizesAndSymbols(
apk_elf_result = concurrent.ForkAndCall(
_ElfInfoFromApk, (apk_path, apk_so_path, tool_prefix))
outdir_context = None
source_mapper = None
elf_object_paths = None
if output_directory:
# Start by finding the elf_object_paths, so that nm can run on them while
# the linker .map is being parsed.
logging.info('Parsing ninja files.')
source_mapper, elf_object_paths = ninja_parser.Parse(
output_directory, elf_path)
source_mapper, ninja_elf_object_paths = (
ninja_parser.Parse(output_directory, elf_path))
logging.debug('Parsed %d .ninja files.', source_mapper.parsed_file_count)
assert not elf_path or elf_object_paths, (
assert not elf_path or ninja_elf_object_paths, (
'Failed to find link command in ninja files for ' +
os.path.relpath(elf_path, output_directory))
if ninja_elf_object_paths:
elf_object_paths, thin_archives = ar.ExpandThinArchives(
ninja_elf_object_paths, output_directory)
known_inputs = set(elf_object_paths)
known_inputs.update(ninja_elf_object_paths)
else:
elf_object_paths = None
known_inputs = None
# When we don't know which elf file is used, just search all paths.
thin_archives = set(
p for p in source_mapper.IterAllPaths()
if p.endswith('.a') and ar.IsThinArchive(
os.path.join(output_directory, p)))
outdir_context = _OutputDirectoryContext(
elf_object_paths=elf_object_paths,
known_inputs=known_inputs,
output_directory=output_directory,
source_mapper=source_mapper,
thin_archives=thin_archives)
section_sizes, raw_symbols = _ParseElfInfo(
map_path, elf_path, tool_prefix, output_directory, track_string_literals,
elf_object_paths)
map_path, elf_path, tool_prefix, track_string_literals, outdir_context)
elf_overhead_size = _CalculateElfOverhead(section_sizes, elf_path)
pak_symbols_by_id = None
......@@ -981,6 +1031,10 @@ def CreateSizeInfo(
section_sizes, raw_symbols, metadata=None, normalize_names=True):
"""Performs operations on all symbols and creates a SizeInfo object."""
logging.debug('Sorting %d symbols', len(raw_symbols))
# TODO(agrieve): Either change this sort so that it's only sorting by section
# (and not using .sort()), or have it specify a total ordering (which must
# also include putting padding-only symbols before others of the same
# address). Note: The sort as-is takes ~1.5 seconds.
raw_symbols.sort(key=lambda s: (
s.IsPak(), s.IsBss(), s.section_name, s.address))
logging.info('Processed %d symbols', len(raw_symbols))
......
#!/usr/bin/env python
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Extract source file information from .ninja files."""
from __future__ import print_function
import argparse
import logging
import os
import re
......@@ -118,3 +122,32 @@ def Parse(output_directory, elf_path):
to_parse.extend(sub_ninjas)
return _SourceMapper(dep_map, len(seen_paths)), elf_inputs
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--output-directory', required=True)
parser.add_argument('--elf-path')
parser.add_argument('--show-inputs', action='store_true')
parser.add_argument('--show-mappings', action='store_true')
args = parser.parse_args()
logging.basicConfig(level=logging.DEBUG,
format='%(levelname).1s %(relativeCreated)6d %(message)s')
source_mapper, elf_inputs = Parse(args.output_directory, args.elf_path)
if not elf_inputs:
elf_inputs = []
print('Found {} elf_inputs, and {} source mappings'.format(
len(elf_inputs), len(source_mapper._dep_map)))
if args.show_inputs:
print('elf_inputs:')
print('\n'.join(elf_inputs))
if args.show_mappings:
print('object_path -> source_path:')
for path in source_mapper.IterAllPaths():
print('{} -> {}'.format(path, source_mapper.FindSourceForPath(path)))
if __name__ == '__main__':
main()
......@@ -30,7 +30,7 @@ BulkObjectFileAnalyzer:
Alias for _BulkObjectFileAnalyzerMaster, but when SUPERSIZE_DISABLE_ASYNC=1,
alias for _BulkObjectFileAnalyzerWorker.
* AnalyzePaths: Run "nm" on all .o files to collect symbol names that exist
within each.
within each. Does not work with thin archives (expand them first).
* SortPaths: Sort results of AnalyzePaths().
* AnalyzeStringLiterals: Must be run after AnalyzePaths() has completed.
Extracts string literals from .o files, and then locates them within the
......@@ -57,6 +57,7 @@ import sys
import threading
import traceback
import ar
import concurrent
import demangle
import models
......@@ -263,41 +264,6 @@ def _ReadFileChunks(path, positions):
return ret
def _IterArchiveChunks(path):
"""For each .o embedded in the given .a file, yields (foo.o, foo_contents)."""
with open(path, 'rb') as f:
if f.read(8) != '!<arch>\n' :
raise Exception('Invalid .a: ' + path)
while True:
line = f.readline()
if not line:
return
parts = line.split()
chunk_size = int(parts[-2])
chunk_data = f.read(chunk_size)
name = parts[0]
if name == '/':
# Initial metadata chunk.
continue
elif name == '//':
name_list = chunk_data
continue
elif name[0] == '/':
# Name is specified as location in name table.
# E.g.: /123
name_offset = int(name[1:])
slash_idx = name_list.index('/', name_offset)
name = name_list[name_offset:slash_idx]
else:
# Name is specified inline.
# E.g.: foo.o/
# Name may not have whitespace before next field, so use rindex.
# E.g.: somelongername.o/1234
name = name[:name.rindex('/')]
yield name, chunk_data
def _ParseOneObjectFileNmOutput(lines):
# Constructors are often repeated because they have the same unmangled
# name, but multiple mangled names. See:
......@@ -332,7 +298,7 @@ def _ReadStringSections(target, output_directory, positions_by_path):
is_archive = isinstance(target, basestring)
string_sections_by_path = {}
if is_archive:
for subpath, chunk in _IterArchiveChunks(
for subpath, chunk in ar.IterArchiveChunks(
os.path.join(output_directory, target)):
path = '{}({})'.format(target, subpath)
positions = positions_by_path.get(path)
......
......@@ -24,18 +24,18 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt
* Contains 0 aliases
* 0 symbols have shared ownership
.data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1)
.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={rel},num_aliases=1)
.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={anon},num_aliases=1)
.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={anon,rel.loc},num_aliases=1)
.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={rel},num_aliases=1)
.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={anon},num_aliases=1)
.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={anon,rel.loc},num_aliases=1)
.data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={},num_aliases=1)
.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={},num_aliases=1)
.data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1)
.data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1)
.data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1)
.rodata@266e600(size_without_padding=32,padding=0,full_name=** merge strings,object_path=,source_path=,flags={},num_aliases=1)
......@@ -44,9 +44,9 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt
.rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1)
.rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1)
.rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=,flags={},num_aliases=1)
.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={anon},num_aliases=1)
.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={anon},num_aliases=1)
.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={anon},num_aliases=1)
.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={anon},num_aliases=1)
.rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=,flags={startup},num_aliases=1)
.text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=,flags={startup},num_aliases=1)
......@@ -57,11 +57,11 @@ Section .bss: has 40.3% of 524520 bytes accounted for from 6 symbols. 775936 byt
.text@28f000(size_without_padding=448,padding=0,full_name=ucnv_extMatchFromU(int const*, int, unsigned short const*, int, unsigned short const*, int, unsigned int*, signed char, signed char),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={},num_aliases=1)
.text@28f1c8(size_without_padding=20,padding=8,full_name=_GLOBAL__sub_I_SkDeviceProfile.cpp,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={startup},num_aliases=1)
.text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=,flags={unlikely},num_aliases=1)
.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={},num_aliases=1)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=,flags={clone,hot},num_aliases=1)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={},num_aliases=1)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/sub/PaintChunker.o,source_path=,flags={clone,hot},num_aliases=1)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={},num_aliases=1)
.text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=,flags={anon,clone},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/sub/ContiguousContainer.o,source_path=,flags={anon,clone},num_aliases=1)
.text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=,flags={},num_aliases=1)
.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=,flags={},num_aliases=1)
......
......@@ -36,18 +36,18 @@ Section .other: has 100.0% of 33984171 bytes accounted for from 1 symbols. 0 byt
* Contains 0 aliases
* 0 symbols have shared ownership
.data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1)
.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1)
.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1)
.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1)
.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1)
.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1)
.data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1)
.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1)
.data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1)
.data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1)
.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1)
.other@0(size_without_padding=0,padding=33984171,full_name=Overhead: ELF file,object_path=,source_path=,flags={},num_aliases=1)
......@@ -59,9 +59,9 @@ Section .other: has 100.0% of 33984171 bytes accounted for from 1 symbols. 0 byt
.rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1)
.rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1)
.text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1)
......@@ -76,11 +76,11 @@ Section .other: has 100.0% of 33984171 bytes accounted for from 1 symbols. 0 byt
.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2)
.text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1)
.text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1)
.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1)
......
......@@ -40,18 +40,18 @@ Section .other: has 100.0% of 33984171 bytes accounted for from 1 symbols. 0 byt
* Contains 0 aliases
* 0 symbols have shared ownership
.data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1)
.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1)
.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1)
.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={rel},num_aliases=1)
.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon},num_aliases=1)
.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,rel.loc},num_aliases=1)
.data@2dffd88(size_without_padding=0,padding=101600,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1)
.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1)
.data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.data.rel.ro@2ddc608(size_without_padding=0,padding=1065132,full_name=** symbol gap 0 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1)
.data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1)
.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1)
.data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1)
.other@0(size_without_padding=0,padding=33984171,full_name=Overhead: ELF file,object_path=,source_path=,flags={},num_aliases=1)
......@@ -63,9 +63,9 @@ Section .other: has 100.0% of 33984171 bytes accounted for from 1 symbols. 0 byt
.rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1)
.rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1)
.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1)
.rodata@2c158e4(size_without_padding=0,padding=3286112,full_name=** symbol gap 1 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1)
.text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1)
......@@ -80,11 +80,11 @@ Section .other: has 100.0% of 33984171 bytes accounted for from 1 symbols. 0 byt
.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2)
.text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/WebKit.a/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4)
.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={},num_aliases=1)
.text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/WebKit.a/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1)
.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container.c,flags={anon,clone},num_aliases=1)
.text@24ca628(size_without_padding=0,padding=35821002,full_name=** symbol gap 2 (end of section),object_path=,source_path=,flags={},num_aliases=1)
.bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1)
.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1)
......
......@@ -170,9 +170,9 @@ Index | Running Total | Section@Address | PSS | Path
BarAlias (num_aliases=4)
39) 77769423 (100.0%) t@0x2a0010 3 (size=12) third_party/fft_float.cc
FooAlias (num_aliases=4)
40) 77769426 (100.0%) t@0x2a0010 3 (size=12) third_party/paint.cc
40) 77769426 (100.0%) t@0x2a0010 3 (size=12) $root_gen_dir/third_party/icu/ucnv_ext.c
blink::ContiguousContainerBase::shrinkToFit (num_aliases=4)
41) 77769429 (100.0%) t@0x2a0010 3 (size=12) $root_gen_dir/third_party/icu/ucnv_ext.c
41) 77769429 (100.0%) t@0x2a0010 3 (size=12) third_party/paint.cc
blink::ContiguousContainerBase::shrinkToFit (num_aliases=4)
42) 77769457 (100.0%) t@0x2a0020 28 third_party/container.c
blink::ContiguousContainerBase::ContiguousContainerBase
......
......@@ -55,5 +55,5 @@ Section Legend: t=.text, r=.rodata, R=.data.rel.ro, d=.data, b=.bss
Index | Running Total | Section@Address | ...
------------------------------------------------------------
~ 0) 10 (100.0%) d@0x2de70a0 +10 (-6->4) num_aliases=1
source_path=third_party/container.c object_path=third_party/WebKit.a/ContiguousContainer.o
source_path=third_party/container.c object_path=third_party/sub/ContiguousContainer.o
flags={} name=base::android::g_renderer_histogram_code
!<thin>
/ 0 0 0 0 60 `
For convenience, each line of this string table is 60 bytes
// 0 0 0 0 120 `
sub/PaintChunker.o/
sub/ContiguousContainer.o/
/40 0 0 0 644 281516 `
/93 0 0 0 644 281516 `
This file has to exist so that it can be checked for whether or not it is a
thin archive. Thin archives start with "!<thin>\n". As you can see, this file is
not a thin archive.
......@@ -38,16 +38,14 @@ _OBJECT_OUTPUTS = {
' int, unsigned short const*, int, unsigned int*, signed char, signed '
'char)'),
],
'obj/third_party/WebKit.a': [
'',
'PaintChunker.o:',
'obj/third_party/sub/PaintChunker.o': [
'01010101 t ' + _SHRINK_TO_FIT,
'010101 t (anonymous namespace)::kAnimationFrameTimeHistogramClassPath',
'010101 r vtable for ChromeMainDelegateAndroid',
('01010101 r blink::(anonymous namespace)::CSSValueKeywordsHash::findVa'
'lueImpl(char const*, unsigned int)::value_word_list'),
'',
'ContiguousContainer.o:',
],
'obj/third_party/sub/ContiguousContainer.o': [
'01010101 d chrome::mojom::FilePatcher::Name_',
'01010101 r vtable for chrome::mojom::FieldTrialRecorderProxy',
'01010101 r google::protobuf::internal::pLinuxKernelMemoryBarrier',
......
......@@ -90,17 +90,17 @@ Memory map
.text.unlikely.foo_bar
0x0028f1e0 0x10e00 ./obj/third_party/icu/../icu/icuuc/ucnv_ext.o
.text._ZN5blink23ContiguousContainerBase11shrinkToFitEv
0x002a0000 0x10 obj/third_party/WebKit.a(PaintChunker.o)
0x002a0000 0x10 obj/third_party/WebKit.a(sub/PaintChunker.o)
0x002a0001 blink::ContiguousContainerBase::shrinkToFit()
.text.hot._ZN5blink23ContiguousContainerBase11shrinkToFitEv2.part.1234.isra.2
0x002a0010 0xc obj/third_party/WebKit.a(PaintChunker.o)
0x002a0010 0xc obj/third_party/WebKit.a(sub/PaintChunker.o)
0x002a0011 blink::ContiguousContainerBase::shrinkToFit()
.text._ZN5blink23ContiguousContainerBaseC2EOS0_
0xffffffffffffffff 0x18 obj/third_party/WebKit.a(ContiguousContainer.o)
0xffffffffffffffff 0x18 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
0x002a0021 blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&)
0x002a0021 blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&)
.text._ZN10_GLOBAL__N5blink12PaintChunker18releasePaintChunksEv.part.1
0x002a1000 0x5e obj/third_party/WebKit.a(ContiguousContainer.o)
0x002a1000 0x5e obj/third_party/WebKit.a(sub/ContiguousContainer.o)
0x002a1001 (anonymous namespace)::blink::PaintChunker::releasePaintChunks() [clone .part.1]
.ARM.exidx 0x024ca628 0x1771c8
......@@ -123,12 +123,12 @@ Memory map
0x0284e370 0x28 obj/base/base/page_allocator.o
0x0284e370 Name
.rodata._ZN6chrome5mojom11FilePatcher5Name_E
0x0284e398 0x20 obj/third_party/WebKit.a(ContiguousContainer.o)
0x0284e398 0x20 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
0x0284e398 chrome::mojom::FilePatcher::Name_
.rodata._ZN12_GLOBAL__N_1L37kAnimationFrameTimeHistogramClassPathE
0x028f3450 0x30 obj/third_party/WebKit.a(PaintChunker.o)
0x028f3450 0x30 obj/third_party/WebKit.a(sub/PaintChunker.o)
.rodata._ZZN10_GLOBAL__N5blink20CSSValueKeywordsHash13findValueImplEPKcjE15value_word_list
0x028f3480 0x4 obj/third_party/WebKit.a(PaintChunker.o)
0x028f3480 0x4 obj/third_party/WebKit.a(sub/PaintChunker.o)
0x028f3480 blink::(anonymous namespace)::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list
.data.rel.ro.local
......@@ -140,7 +140,7 @@ Memory map
0x02c17728 0x18 ./obj/third_party/icu/../icu/icuuc/ucnv_ext.o
0x02c17728 vtable for chrome::mojom::FieldTrialRecorder
.data.rel.ro.local._ZTVN6chrome5mojom23FieldTrialRecorderProxyE
0x02c17740 0xc0d90 obj/third_party/WebKit.a(ContiguousContainer.o)
0x02c17740 0xc0d90 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
0x02c17740 vtable for chrome::mojom::FieldTrialRecorderProxy
.data.rel.ro.local..Lswitch.table.45
0x02cd84e0 0x10 ../../third_party/gvr-android-sdk/libgvr_shim_static_arm.a(libcontroller_api_impl.a_controller_api_impl.o)
......@@ -149,7 +149,7 @@ Memory map
.data.rel.ro 0x02cd8500 0x104108
.data.rel.ro._ZTV25ChromeMainDelegateAndroid
0x02cd8500 0x38 obj/third_party/WebKit.a(PaintChunker.o)
0x02cd8500 0x38 obj/third_party/WebKit.a(sub/PaintChunker.o)
0x02cd8500 vtable for ChromeMainDelegateAndroid
.data.rel.ro._ZTVN4mojo15MessageReceiverE
0x02cd8538 0x18 obj/base/base/page_allocator.o
......@@ -179,14 +179,14 @@ Memory map
0x02de7000 0x4 obj/base/base/page_allocator.o
0x02de7000 google::protobuf::internal::pLinuxKernelCmpxchg
.data._ZN6google8protobuf8internal25pLinuxKernelMemoryBarrierE
0x02de7004 0x4 obj/third_party/WebKit.a(ContiguousContainer.o)
0x02de7004 0x4 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
0x02de7004 google::protobuf::internal::pLinuxKernelMemoryBarrier
.data.rel._ZN4base7androidL22kBaseRegisteredMethodsE
0x02de7008 0x98 obj/third_party/WebKit.a(ContiguousContainer.o)
0x02de7008 0x98 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
.data._ZN4base7android12_GLOBAL__N_125g_renderer_histogram_codeE
0x02de70a0 0x4 obj/third_party/WebKit.a(ContiguousContainer.o)
0x02de70a0 0x4 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
.data.rel.local._ZN4base7android12_GLOBAL__N_124g_library_version_numberE
0x02de70a4 0x4 obj/third_party/WebKit.a(ContiguousContainer.o)
0x02de70a4 0x4 obj/third_party/WebKit.a(sub/ContiguousContainer.o)
.bss 0x02dffda0 0x13d7e8
.bss.g_chrome_content_browser_client
......
This file has to exist so that it can be checked for whether or not it is a
thin archive. Thin archives start with "!<thin>\n". As you can see, this file is
not a thin archive.
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