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