| About |
| ===== |
| |
| This directory contains the necessary components to run Non-SFI NaCl |
| nexes (native executables) from within Mojo. |
| |
| Using |
| ===== |
| |
| The Non-SFI NaCl and accompanying tests should be built by default for Linux. |
| The boolean indicating if they are built is "mojo_use_nacl_nonsfi", defined |
| inside the BUILD files. |
| |
| Building Non-SFI NaCl |
| --------------------- |
| |
| Build Mojo (all following commands assume you are in the root of the mojo |
| repository): |
| |
| ``` |
| $ ./mojo/tools/mojob.py gn |
| $ ./mojo/tools/mojob.py build |
| ``` |
| |
| Doing this build step will automatically create the necessary content handlers |
| and pexes. |
| |
| Translating and Running Pexes |
| ----------------------------- |
| |
| When portable executable files (pexes) are generated by mojo, they are created |
| as `.pexe.mojo` files. These pexes are generated by building a gn target with |
| the `mojo_native_application` template with a PNaCl toolchain. |
| |
| The "pexe" part of the name comes from the fact that they are portable, and the |
| "mojo" part of the name comes from the fact that they have the line `#!mojo |
| mojo:content_handler_nonsfi_pexe` prepended to them, so the appropriate pexe |
| content handler can be found by the Mojo Shell. |
| |
| To run the `FOOBAR.pexe.mojo` pexe (aka, to translate and execute it), run the |
| following: |
| |
| ``` |
| $ ./out/Debug/mojo_shell --enable-multiprocess ./out/Debug/FOOBAR.pexe.mojo |
| ``` |
| |
| or, alternatively, for a version compatible with Android: |
| |
| ``` |
| $ ./mojo/devtools/common/mojo_run --enable-multiprocess mojo:FOOBAR.pexe |
| [--android] |
| ``` |
| |
| For more information on the process of translating and handling nexes and pexes, |
| refer to the `services/nacl` directory. |
| |
| Manually Translating Pexes and Running Nexes |
| -------------------------------------------- |
| |
| A raw pexe of unit tests will be built, at |
| `./out/Debug/newlib_pnacl/monacl_test.pexe`. To manually translate this pexe |
| into a non-SFI nexe: |
| |
| ``` |
| $ ./native_client/toolchain/linux_x86/pnacl_newlib/bin/pnacl-translate \ |
| ./out/Debug/newlib_pnacl/FOOBAR.pexe -o FOOBAR.nexe -arch x86-32-nonsfi |
| ``` |
| |
| Now, you should have the fully translated nexe (called |
| `FOOBAR.nexe`). You can run the nexe through the monacl shell |
| (a minimal, "nexe-only" shell, which loads the nexe ELF file -- see |
| `monacl_shell_nonsfi.cc`): |
| |
| ``` |
| $ ./out/Debug/clang_x86/monacl_shell_nonsfi FOOBAR.nexe |
| ``` |
| |
| This monacl_shell_nonsfi is the easiest way to run nexes in Mojo -- however, it |
| is not the only way. Usually, applications are launched through the |
| "mojo_shell", but some additional information is required to know how to handle |
| this content (i.e., how does the mojo_shell know it is dealing with a nonsfi |
| nexe?). |
| |
| The BUILD.gn files in Mojo automatically make the "monacl_test" pexe, translate |
| it to a nexe, and prepend a line (`#!mojo mojo:content_handler_nonsfi_nexe`) to |
| the front of the file, at which point it is also runnable through the |
| mojo_shell. |
| These files, which start with this "#!" line, are ".mojo" files. The nexes can |
| be run like this: |
| |
| ``` |
| $ ./out/Debug/mojo_shell --enable-multiprocess out/Debug/FOOBAR.mojo |
| ``` |