Ответ 1
Вы не можете запускать предварительно скомпилированный код в NaCl или PNaCl. Вы должны использовать компиляторы, предоставленные SDK. Для этого есть три основные причины:
- NaCl - это изолированная песочница исполнения, которая в значительной степени основана на разработке машинного кода (x86-32, x86-64, ARM, MIPS). Это обычный машинный код с точки зрения процессора, но позволяет песочнице запускать валидатор и следить за тем, чтобы код не мог сделать ничего злонамеренного. Это называется Software Fault Isolation и объясняется в этой статье. Другие песочницы ISA также документированы.
- PNaCl нацеливает NaCl, но является промежуточным представлением архитектуры-агностик. Это означает, что вы отправляете то, что можно считать байт-кодом, и браузер определяет, какой тип машинного кода (x86-32, x86-64, ARM, MIPS) должен генерироваться на основе пользовательской машины. Разработчик не генерирует 4 бинарных файла.
- В обоих случаях код может выполняться как есть на Windows, MacOSX, Linux, ChromeOS и (в то время как обычно не поставляется) Android. Это означает, что песочница NaCl представляет собой операционную систему и предлагает те же API. Эти API отличаются от других ОС, хотя они довольно близки к POSIX, особенно если вы используете nacl_io.
Вышеупомянутые пункты требуют, чтобы вы использовали компиляторы, предоставленные SDK.
Технически возможно запускать двоичные файлы, созданные для других архитектур или операционных систем, поскольку система завершена. Что делает QEMU, что Rosetta, что Transmeta, и что позволяет Android Runtime for Chome (ARC). Обычно это требует бинарного перевода и эмуляции всех вызовов операционной системы. Это технически сложно реализовать и часто имеет серьезные эксплуатационные издержки. Я не рекомендую изучать этот вариант.