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.
6 """Wrapper script for launching application within the sel_ldr.
17 SCRIPT_DIR
= os
.path
.dirname(os
.path
.abspath(__file__
))
18 NACL_SDK_ROOT
= os
.path
.dirname(SCRIPT_DIR
)
20 if sys
.version_info
< (2, 7, 0):
21 sys
.stderr
.write("python 2.7 or later is required run this script\n")
25 class Error(Exception):
31 sys
.stderr
.write(str(msg
) + '\n')
36 qemu_locations
= [os
.path
.join(SCRIPT_DIR
, 'qemu_arm'),
37 os
.path
.join(SCRIPT_DIR
, 'qemu-arm')]
38 qemu_locations
+= [os
.path
.join(path
, 'qemu_arm')
39 for path
in os
.environ
["PATH"].split(os
.pathsep
)]
40 qemu_locations
+= [os
.path
.join(path
, 'qemu-arm')
41 for path
in os
.environ
["PATH"].split(os
.pathsep
)]
42 # See if qemu is in any of these locations.
44 for loc
in qemu_locations
:
45 if os
.path
.isfile(loc
) and os
.access(loc
, os
.X_OK
):
52 epilog
= 'Example: sel_ldr.py my_nexe.nexe'
53 parser
= argparse
.ArgumentParser(description
=__doc__
, epilog
=epilog
)
54 parser
.add_argument('-v', '--verbose', action
='store_true',
55 help='Verbose output')
56 parser
.add_argument('-d', '--debug', action
='store_true',
57 help='Enable debug stub')
58 parser
.add_argument('--debug-libs', action
='store_true',
59 help='For dynamic executables, reference debug '
60 'libraries rather then release')
61 parser
.add_argument('executable', help='executable (.nexe) to run')
62 parser
.add_argument('args', nargs
='*', help='argument to pass to exectuable')
64 # To enable bash completion for this command first install optcomplete
65 # and then add this line to your .bashrc:
66 # complete -F _optcomplete sel_ldr.py
69 optcomplete
.autocomplete(parser
)
73 options
= parser
.parse_args(argv
)
78 osname
= getos
.GetPlatform()
79 if not os
.path
.exists(options
.executable
):
80 raise Error('executable not found: %s' % options
.executable
)
81 if not os
.path
.isfile(options
.executable
):
82 raise Error('not a file: %s' % options
.executable
)
84 arch
, dynamic
= create_nmf
.ParseElfHeader(options
.executable
)
86 if arch
== 'arm' and osname
!= 'linux':
87 raise Error('Cannot run ARM executables under sel_ldr on ' + osname
)
89 arch_suffix
= arch
.replace('-', '_')
91 sel_ldr
= os
.path
.join(SCRIPT_DIR
, 'sel_ldr_%s' % arch_suffix
)
92 irt
= os
.path
.join(SCRIPT_DIR
, 'irt_core_%s.nexe' % arch_suffix
)
95 Log('ROOT = %s' % NACL_SDK_ROOT
)
96 Log('SEL_LDR = %s' % sel_ldr
)
100 if osname
== 'linux':
101 # Run sel_ldr under nacl_helper_bootstrap
102 helper
= os
.path
.join(SCRIPT_DIR
, 'nacl_helper_bootstrap_%s' % arch_suffix
)
103 Log('HELPER = %s' % helper
)
104 cmd
.insert(0, helper
)
105 cmd
.append('--r_debug=0xXXXXXXXXXXXXXXXX')
106 cmd
.append('--reserved_at_zero=0xXXXXXXXXXXXXXXXX')
108 cmd
+= ['-a', '-B', irt
]
113 if not options
.verbose
:
114 cmd
+= ['-l', os
.devnull
]
117 # Use the QEMU arm emulator if available.
118 qemu_bin
= FindQemu()
120 qemu
= [qemu_bin
, '-cpu', 'cortex-a8', '-L',
121 os
.path
.abspath(os
.path
.join(NACL_SDK_ROOT
, 'toolchain',
122 'linux_arm_trusted'))]
123 # '-Q' disables platform qualification, allowing arm binaries to run.
124 cmd
= qemu
+ cmd
+ ['-Q']
126 raise Error('Cannot run ARM executables under sel_ldr without an emulator'
127 '. Try installing QEMU (http://wiki.qemu.org/).')
130 if options
.debug_libs
:
131 libpath
= os
.path
.join(NACL_SDK_ROOT
, 'lib',
132 'glibc_%s' % arch_suffix
, 'Debug')
134 libpath
= os
.path
.join(NACL_SDK_ROOT
, 'lib',
135 'glibc_%s' % arch_suffix
, 'Release')
136 toolchain
= '%s_x86_glibc' % osname
137 sdk_lib_dir
= os
.path
.join(NACL_SDK_ROOT
, 'toolchain',
138 toolchain
, 'x86_64-nacl')
140 sdk_lib_dir
= os
.path
.join(sdk_lib_dir
, 'lib')
142 sdk_lib_dir
= os
.path
.join(sdk_lib_dir
, 'lib32')
143 ldso
= os
.path
.join(sdk_lib_dir
, 'runnable-ld.so')
145 Log('LD.SO = %s' % ldso
)
146 libpath
+= ':' + sdk_lib_dir
147 cmd
.append('--library-path')
151 # Append arguments for the executable itself.
152 cmd
.append(options
.executable
)
156 return subprocess
.call(cmd
)
159 if __name__
== '__main__':
161 sys
.exit(main(sys
.argv
[1:]))
163 sys
.stderr
.write(str(e
) + '\n')