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.

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

TODO

  • Use subzero (a NaCl project to improve translation speed) for pexe translation.
  • Enable caching of translated pexes.