| Index: third_party/android_platform/development/scripts/stack_libs.py
|
| diff --git a/third_party/android_platform/development/scripts/stack_libs.py b/third_party/android_platform/development/scripts/stack_libs.py
|
| deleted file mode 100755
|
| index ee5a67e0a0272c76c5f6a056448b23a120782ec7..0000000000000000000000000000000000000000
|
| --- a/third_party/android_platform/development/scripts/stack_libs.py
|
| +++ /dev/null
|
| @@ -1,125 +0,0 @@
|
| -#!/usr/bin/env python
|
| -#
|
| -# Copyright (c) 2015 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.
|
| -
|
| -
|
| -"""Identifies address adjustments required for native crash dumps."""
|
| -
|
| -import glob
|
| -import os.path
|
| -import subprocess
|
| -
|
| -
|
| -_BASE_APK = 'base.apk'
|
| -_LIBCHROME_SO = 'libchrome.so'
|
| -
|
| -
|
| -def GetTargetAndroidVersionNumber(lines):
|
| - """Return the Android major version number from the build fingerprint.
|
| -
|
| - Args:
|
| - lines: Lines read from the tombstone file, before preprocessing.
|
| - Returns:
|
| - 5, 6, etc, or None if not determinable (developer build?)
|
| - """
|
| - # For example, "Build fingerprint: 'Android/aosp_flo/flo:5.1.1/...'" is 5.
|
| - for line in lines:
|
| - if line.startswith('Build fingerprint: '):
|
| - fingerprint = line.split()[2]
|
| - version = fingerprint.split('/')[2].split(':')[1].split('.')[0]
|
| - try:
|
| - return int(version)
|
| - except ValueError:
|
| - return None
|
| - return None
|
| -
|
| -
|
| -def _HasElfHeader(path):
|
| - """Return True if the file at the given path has an ELF magic header.
|
| -
|
| - Minimal check only, for 'ELF' in bytes 1 to 3 of the file. Filters out
|
| - the zero-byte false-positives such as libchromeview.so returned by glob.
|
| -
|
| - Args:
|
| - path: Path to file to check.
|
| - Returns:
|
| - True or False
|
| - """
|
| - with open(path) as stream:
|
| - elf_header = stream.read(4)
|
| - return len(elf_header) == 4 and elf_header[1:4] == 'ELF'
|
| -
|
| -
|
| -def _ReadElfProgramHeaders(lib):
|
| - """Return an iterable of program headers, from 'readelf -l ...'.
|
| -
|
| - Uses the platform readelf in all cases. This is somewhat lazy, but suffices
|
| - in practice because program headers in ELF files are architecture-agnostic.
|
| -
|
| - Args:
|
| - lib: Library file to read.
|
| - Returns:
|
| - [readelf -l output line, ...]
|
| - """
|
| - string = subprocess.check_output(['readelf', '-l', lib])
|
| - return string.split('\n')
|
| -
|
| -
|
| -def _FindMinLoadVaddr(lib):
|
| - """Return the minimum VirtAddr field of all library LOAD segments.
|
| -
|
| - Args:
|
| - lib: Library file to read.
|
| - Returns:
|
| - Min VirtAddr field for all LOAD segments, or 0 if none found.
|
| - """
|
| - vaddrs = []
|
| - # Locate LOAD lines and find the smallest VirtAddr field, eg:
|
| - # Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
|
| - # LOAD 0x000000 0x001d6000 0x001d6000 0x20f63fc 0x20f63fc R E 0x1000
|
| - # LOAD 0x20f6970 0x022cd970 0x022cd970 0x182df8 0x1b4490 RW 0x1000
|
| - # would return 0x1d6000. Ignores all non-LOAD lines.
|
| - for line in _ReadElfProgramHeaders(lib):
|
| - elements = line.split()
|
| - if elements and elements[0] == 'LOAD':
|
| - vaddrs.append(int(elements[2], 16))
|
| - if vaddrs:
|
| - return min(vaddrs)
|
| - return 0
|
| -
|
| -
|
| -def GetLoadVaddrs(apk_dir):
|
| - """Return a dictionary of minimum VirtAddr fields for libraries in apk_dir.
|
| -
|
| - The dictionary returned may be passed to stack_core.ConvertTrace(). In
|
| - pre-M Android releases the addresses printed by debuggerd into tombstones
|
| - do not take account of non-zero vaddrs. Here we collect this information,
|
| - so that we can use it later to correct such debuggerd tombstones.
|
| -
|
| - Args:
|
| - apk_dir: Path to APK staging directory.
|
| - Returns:
|
| - {'libchrome.so': 12345, ...}
|
| - """
|
| - pathname = apk_dir + '/libs/*/*.so'
|
| - libs = [lib for lib in glob.glob(pathname) if _HasElfHeader(lib)]
|
| -
|
| - load_vaddrs = {}
|
| - for lib in libs:
|
| - min_vaddr = _FindMinLoadVaddr(lib)
|
| - if min_vaddr:
|
| - # Store with the library basename as the key. This is because once on
|
| - # the device its path may not fully match its place in the APK staging
|
| - # directory
|
| - load_vaddrs[os.path.basename(lib)] = min_vaddr
|
| -
|
| - # Direct load from APK causes debuggerd to tag trace lines as if from the
|
| - # file .../base.apk. So if we encounter a libchrome.so with packed
|
| - # relocations, replicate this as base.apk so that later adjustment code
|
| - # finds the appropriate adjustment.
|
| - if _LIBCHROME_SO in load_vaddrs:
|
| - load_vaddrs[_BASE_APK] = load_vaddrs[_LIBCHROME_SO]
|
| -
|
| - return load_vaddrs
|
|
|