1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#!/usr/bin/env python 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# Copyright 2014 The Chromium Authors. All rights reserved. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# Use of this source code is governed by a BSD-style license that can be 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# found in the LICENSE file. 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"""Pack ARM relative relocations in a library (or copy unchanged). 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIf --enable-packing and --configuration-name=='Release', invoke the 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochrelocation_packer tool to pack the .rel.dyn section in the given library 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfiles. This step is inserted after the libraries are stripped. Packing 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochadds a new .android.rel.dyn section to the file and reduces the size of 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.rel.dyn accordingly. 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCurrently packing only understands ARM32 shared libraries. For all other 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdocharchitectures --enable-packing should be set to zero. In this case the 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscript copies files verbatim, with no attempt to pack relative relocations. 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAny library listed in --exclude-packing-list is also copied verbatim, 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochirrespective of any --enable-packing setting. Typically this would be 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch'libchromium_android_linker.so'. 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch""" 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport optparse 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport os 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport shlex 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport shutil 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport sys 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport tempfile 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom util import build_utils 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdef PackArmLibraryRelocations(android_pack_relocations, 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch android_objcopy, 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch library_path, 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output_path): 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if not build_utils.IsTimeStale(output_path, [library_path]): 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch # Copy and add a 'NULL' .android.rel.dyn section for the packing tool. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch with tempfile.NamedTemporaryFile() as stream: 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch stream.write('NULL') 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch stream.flush() 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch objcopy_command = [android_objcopy, 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch '--add-section', '.android.rel.dyn=%s' % stream.name, 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch library_path, output_path] 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch build_utils.CheckOutput(objcopy_command) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch # Pack R_ARM_RELATIVE relocations. 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pack_command = [android_pack_relocations, output_path] 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch build_utils.CheckOutput(pack_command) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdef CopyArmLibraryUnchanged(library_path, output_path): 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if not build_utils.IsTimeStale(output_path, [library_path]): 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shutil.copy(library_path, output_path) 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)def main(args): 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) args = build_utils.ExpandFileArgs(args) 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser = optparse.OptionParser() 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--configuration-name', 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default='Release', 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help='Gyp configuration name (i.e. Debug, Release)') 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--enable-packing', 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch choices=['0', '1'], 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help=('Pack relocations if 1 and configuration name is \'Release\',' 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ' otherwise plain file copy')) 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--exclude-packing-list', 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default='', 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help='Names of any libraries explicitly not packed') 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--android-pack-relocations', 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help='Path to the ARM relocations packer binary') 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--android-objcopy', 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help='Path to the toolchain\'s objcopy binary') 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--stripped-libraries-dir', 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help='Directory for stripped libraries') 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--packed-libraries-dir', 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch help='Directory for packed libraries') 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) parser.add_option('--libraries', 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) help='List of libraries') 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parser.add_option('--stamp', help='Path to touch on success') 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) options, _ = parser.parse_args(args) 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enable_packing = (options.enable_packing == '1' and 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch options.configuration_name == 'Release') 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch exclude_packing_set = set(shlex.split(options.exclude_packing_list)) 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) libraries = build_utils.ParseGypList(options.libraries) 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch build_utils.MakeDirectory(options.packed_libraries_dir) 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for library in libraries: 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch library_path = os.path.join(options.stripped_libraries_dir, library) 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output_path = os.path.join(options.packed_libraries_dir, library) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if enable_packing and library not in exclude_packing_set: 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PackArmLibraryRelocations(options.android_pack_relocations, 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch options.android_objcopy, 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch library_path, 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output_path) 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else: 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CopyArmLibraryUnchanged(library_path, output_path) 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if options.stamp: 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch build_utils.Touch(options.stamp) 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 0 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdochif __name__ == '__main__': 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) sys.exit(main(sys.argv[1:])) 116