This directory contains the necessary components to run Non-SFI NaCl nexes (native executables) from within Mojo.
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.
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 a pexe of unit tests, at ./out/Debug/newlib_pnacl/monacl_test.pexe. To translate a 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 this 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