• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Wrapper script for launching application within the sel_ldr.
7"""
8
9import optparse
10import os
11import subprocess
12import sys
13
14import create_nmf
15import getos
16
17SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
18NACL_SDK_ROOT = os.path.dirname(SCRIPT_DIR)
19
20if sys.version_info < (2, 6, 0):
21  sys.stderr.write("python 2.6 or later is required run this script\n")
22  sys.exit(1)
23
24
25class Error(Exception):
26  pass
27
28
29def Log(msg):
30  if Log.verbose:
31    sys.stderr.write(str(msg) + '\n')
32Log.verbose = False
33
34
35def main(argv):
36  usage = 'Usage: %prog [options] <.nexe>'
37  epilog = 'Example: sel_ldr.py my_nexe.nexe'
38  parser = optparse.OptionParser(usage, description=__doc__, epilog=epilog)
39  parser.add_option('-v', '--verbose', action='store_true',
40                    help='Verbose output')
41  parser.add_option('-d', '--debug', action='store_true',
42                    help='Enable debug stub')
43  parser.add_option('--debug-libs', action='store_true',
44                    help='For dynamic executables, reference debug '
45                         'libraries rather then release')
46
47  # To enable bash completion for this command first install optcomplete
48  # and then add this line to your .bashrc:
49  #  complete -F _optcomplete sel_ldr.py
50  try:
51    import optcomplete
52    optcomplete.autocomplete(parser)
53  except ImportError:
54    pass
55
56  options, args = parser.parse_args(argv)
57  if not args:
58    parser.error('No executable file specified')
59
60  nexe = args[0]
61  if options.verbose:
62    Log.verbose = True
63
64  osname = getos.GetPlatform()
65  if not os.path.exists(nexe):
66    raise Error('executable not found: %s' % nexe)
67  if not os.path.isfile(nexe):
68    raise Error('not a file: %s' % nexe)
69
70  arch, dynamic = create_nmf.ParseElfHeader(nexe)
71
72  if arch == 'arm':
73    raise Error('Cannot run ARM executables under sel_ldr')
74
75  arch_suffix = arch.replace('-', '_')
76
77  sel_ldr = os.path.join(SCRIPT_DIR, 'sel_ldr_%s' % arch_suffix)
78  irt = os.path.join(SCRIPT_DIR, 'irt_core_%s.nexe' % arch_suffix)
79  if osname == 'win':
80    sel_ldr += '.exe'
81  Log('ROOT    = %s' % NACL_SDK_ROOT)
82  Log('SEL_LDR = %s' % sel_ldr)
83  Log('IRT     = %s' % irt)
84  cmd = [sel_ldr]
85
86  if osname == 'linux':
87    # Run sel_ldr under nacl_helper_bootstrap
88    helper = os.path.join(SCRIPT_DIR, 'nacl_helper_bootstrap_%s' % arch_suffix)
89    Log('HELPER  = %s' % helper)
90    cmd.insert(0, helper)
91    cmd.append('--r_debug=0xXXXXXXXXXXXXXXXX')
92    cmd.append('--reserved_at_zero=0xXXXXXXXXXXXXXXXX')
93
94  cmd += ['-a', '-B', irt]
95
96  if options.debug:
97    cmd.append('-g')
98
99  if not options.verbose:
100    cmd += ['-l', os.devnull]
101
102  if dynamic:
103    if options.debug_libs:
104      libpath = os.path.join(NACL_SDK_ROOT, 'lib',
105                            'glibc_%s' % arch_suffix, 'Debug')
106    else:
107      libpath = os.path.join(NACL_SDK_ROOT, 'lib',
108                            'glibc_%s' % arch_suffix, 'Release')
109    toolchain = '%s_x86_glibc' % osname
110    sdk_lib_dir = os.path.join(NACL_SDK_ROOT, 'toolchain',
111                               toolchain, 'x86_64-nacl')
112    if arch == 'x86-64':
113      sdk_lib_dir = os.path.join(sdk_lib_dir, 'lib')
114    else:
115      sdk_lib_dir = os.path.join(sdk_lib_dir, 'lib32')
116    ldso = os.path.join(sdk_lib_dir, 'runnable-ld.so')
117    cmd.append(ldso)
118    Log('LD.SO = %s' % ldso)
119    libpath += ':' + sdk_lib_dir
120    cmd.append('--library-path')
121    cmd.append(libpath)
122
123
124  if args:
125    # Append arguments for the executable itself.
126    cmd += args
127
128  Log(cmd)
129  rtn = subprocess.call(cmd)
130  return rtn
131
132
133if __name__ == '__main__':
134  try:
135    sys.exit(main(sys.argv[1:]))
136  except Error as e:
137    sys.stderr.write(str(e) + '\n')
138    sys.exit(1)
139