1 {{+bindTo:partials.standard_nacl_article}} 2 3 <section id="frequently-asked-questions"> 4 <h1 id="frequently-asked-questions">Frequently Asked Questions</h1> 5 <div class="contents local" id="contents" style="display: none"> 6 <ul class="small-gap"> 7 <li><p class="first"><a class="reference internal" href="#what-is-native-client-good-for" id="id1">What is Native Client Good For?</a></p> 8 <ul class="small-gap"> 9 <li><a class="reference internal" href="#why-did-google-build-native-client" id="id2">Why did Google build Native Client?</a></li> 10 <li><a class="reference internal" href="#when-should-i-use-portable-native-client-instead-of-native-client" id="id3">When should I use Portable Native Client instead of Native Client?</a></li> 11 <li><a class="reference internal" href="#when-should-i-use-portable-native-client-native-client" id="id4">When should I use Portable Native Client / Native Client?</a></li> 12 <li><a class="reference internal" href="#how-fast-does-code-run-in-portable-native-client" id="id5">How fast does code run in Portable Native Client?</a></li> 13 <li><a class="reference internal" href="#why-use-portable-native-client-instead-of-technology-x" id="id6">Why use Portable Native Client instead of <em><technology X></em>?</a></li> 14 <li><a class="reference internal" href="#if-i-want-direct-access-to-the-os-should-i-use-native-client" id="id7">If I want direct access to the OS, should I use Native Client?</a></li> 15 </ul> 16 </li> 17 <li><p class="first"><a class="reference internal" href="#development-environments-and-tools" id="id8">Development Environments and Tools</a></p> 18 <ul class="small-gap"> 19 <li><a class="reference internal" href="#what-development-environment-and-development-operating-system-do-you-recommend" id="id9">What development environment and development operating system do you recommend?</a></li> 20 <li><a class="reference internal" href="#i-m-not-familiar-with-native-development-tools-can-i-still-use-the-native-client-sdk" id="id10">I’m not familiar with native development tools, can I still use the Native Client SDK?</a></li> 21 </ul> 22 </li> 23 <li><p class="first"><a class="reference internal" href="#openness-and-supported-architectures-and-languages" id="id11">Openness, and Supported Architectures and Languages</a></p> 24 <ul class="small-gap"> 25 <li><a class="reference internal" href="#is-native-client-open-is-it-a-standard" id="id12">Is Native Client open? Is it a standard?</a></li> 26 <li><a class="reference internal" href="#what-are-the-supported-instruction-set-architectures" id="id13">What are the supported instruction set architectures?</a></li> 27 <li><a class="reference internal" href="#do-i-have-to-use-c-or-c-i-d-really-like-to-use-another-language" id="id14">Do I have to use C or C++? I’d really like to use another language.</a></li> 28 <li><a class="reference internal" href="#do-you-only-support-chrome-what-about-other-browsers" id="id15">Do you only support Chrome? What about other browsers?</a></li> 29 <li><a class="reference internal" href="#what-s-the-difference-between-npapi-and-pepper" id="id16">What’s the difference between NPAPI and Pepper?</a></li> 30 <li><a class="reference internal" href="#is-npapi-part-of-the-native-client-sdk" id="id17">Is NPAPI part of the Native Client SDK?</a></li> 31 <li><a class="reference internal" href="#does-native-client-support-simd-vector-instructions" id="id18">Does Native Client support SIMD vector instructions?</a></li> 32 <li><a class="reference internal" href="#can-i-use-native-client-for-3d-graphics" id="id19">Can I use Native Client for 3D graphics?</a></li> 33 <li><a class="reference internal" href="#does-native-client-support-concurrency-parallelism" id="id20">Does Native Client support concurrency/parallelism?</a></li> 34 </ul> 35 </li> 36 <li><p class="first"><a class="reference internal" href="#coming-soon" id="id21">Coming Soon</a></p> 37 <ul class="small-gap"> 38 <li><a class="reference internal" href="#do-native-client-modules-have-access-to-external-devices" id="id22">Do Native Client modules have access to external devices?</a></li> 39 </ul> 40 </li> 41 <li><p class="first"><a class="reference internal" href="#security-and-privacy" id="id23">Security and Privacy</a></p> 42 <ul class="small-gap"> 43 <li><a class="reference internal" href="#what-happens-to-my-data-when-i-use-native-client" id="id24">What happens to my data when I use Native Client?</a></li> 44 <li><a class="reference internal" href="#how-does-native-client-prevent-sandboxed-code-from-doing-bad-things" id="id25">How does Native Client prevent sandboxed code from doing Bad Things?</a></li> 45 <li><a class="reference internal" href="#how-does-google-know-that-the-safety-measures-in-native-client-are-sufficient" id="id26">How does Google know that the safety measures in Native Client are sufficient?</a></li> 46 </ul> 47 </li> 48 <li><p class="first"><a class="reference internal" href="#development" id="id27">Development</a></p> 49 <ul class="small-gap"> 50 <li><a class="reference internal" href="#how-do-i-debug" id="id28">How do I debug?</a></li> 51 <li><a class="reference internal" href="#how-do-i-build-x86-32-x86-64-or-arm-nexes" id="id29">How do I build x86-32, x86-64 or ARM <code>.nexes</code>?</a></li> 52 <li><a class="reference internal" href="#how-can-my-web-application-determine-which-nexe-to-load" id="id30">How can my web application determine which <code>.nexe</code> to load?</a></li> 53 <li><a class="reference internal" href="#is-it-possible-to-build-a-native-client-module-with-just-plain-c-not-c" id="id31">Is it possible to build a Native Client module with just plain C (not C++)?</a></li> 54 <li><a class="reference internal" href="#what-unix-system-calls-can-i-make-through-native-client" id="id32">What UNIX system calls can I make through Native Client?</a></li> 55 <li><a class="reference internal" href="#is-my-favorite-third-party-library-available-for-native-client" id="id33">Is my favorite third-party library available for Native Client?</a></li> 56 <li><a class="reference internal" href="#do-all-the-files-in-an-application-need-to-be-served-from-the-same-domain" id="id34">Do all the files in an application need to be served from the same domain?</a></li> 57 </ul> 58 </li> 59 <li><p class="first"><a class="reference internal" href="#portability" id="id35">Portability</a></p> 60 <ul class="small-gap"> 61 <li><a class="reference internal" href="#do-i-have-to-do-anything-special-to-make-my-application-run-on-different-operating-systems" id="id36">Do I have to do anything special to make my application run on different operating systems?</a></li> 62 <li><a class="reference internal" href="#how-easy-is-it-to-port-my-existing-native-code-to-native-client" id="id37">How easy is it to port my existing native code to Native Client?</a></li> 63 </ul> 64 </li> 65 <li><p class="first"><a class="reference internal" href="#troubleshooting" id="id38">Troubleshooting</a></p> 66 <ul class="small-gap"> 67 <li><a class="reference internal" href="#my-pexe-isn-t-loading-help" id="id39">My <code>.pexe</code> isn’t loading, help!</a></li> 68 <li><a class="reference internal" href="#my-nexe-files-never-finish-loading-what-gives" id="id40">My <code>.nexe</code> files never finish loading. What gives?</a></li> 69 </ul> 70 </li> 71 </ul> 72 73 </div><p>This document answers some frequently asked questions about Native 74 Client (NaCl) and Portable Native Client (PNaCl, pronounced 75 “pinnacle”). For a high-level overview of Native Client, see the 76 <a class="reference internal" href="/native-client/overview.html"><em>Technical Overview</em></a>.</p> 77 <p>If you have questions that aren’t covered in this FAQ:</p> 78 <ul class="small-gap"> 79 <li>Scan through the <a class="reference internal" href="/native-client/sdk/release-notes.html"><em>Release Notes</em></a>.</li> 80 <li>Search through or ask on the <a class="reference internal" href="/native-client/help.html"><em>Native Client Forums</em></a>.</li> 81 </ul> 82 <h2 id="what-is-native-client-good-for">What is Native Client Good For?</h2> 83 <h3 id="why-did-google-build-native-client">Why did Google build Native Client?</h3> 84 <ul class="small-gap"> 85 <li><strong>Performance:</strong> Native Client modules run nearly as fast as native 86 compiled code.</li> 87 <li><strong>Security:</strong> Native Client lets users run native compiled code in the 88 browser with the same level of security and privacy as traditional web 89 applications.</li> 90 <li><p class="first"><strong>Convenience:</strong></p> 91 <ul class="small-gap"> 92 <li>Developers can leverage existing code, written in C/C++ or other 93 languages, in their applications without forcing users to install a 94 plugin.</li> 95 <li>This code can interact with the embedding web page as part of an 96 HTML and JavaScript web application, or it can be a self-contained 97 and immersive experience.</li> 98 </ul> 99 </li> 100 <li><p class="first"><strong>Portability:</strong> Native Client and Portable Native Client applications 101 can execute on:</p> 102 <ul class="small-gap"> 103 <li>The Windows, Mac, Linux or ChromeOS operating systems.</li> 104 <li>Processors with the x86-32, x86-64, or ARM instruction set 105 architectures. Native Client also has experimental support for MIPS.</li> 106 </ul> 107 </li> 108 </ul> 109 <p>Portable Native client further enhances the above:</p> 110 <ul class="small-gap"> 111 <li><strong>Performance:</strong> Each PNaCl release brings with it more performance 112 enhancements. Already-released applications get faster over time, 113 conserving user’s battery.</li> 114 <li><strong>Security:</strong> Users are kept secure with an ever-improving sandbox 115 model which adapts to novel attacks, without affecting 116 already-released applications.</li> 117 <li><strong>Convenience:</strong> Developers only need to ship a single <code>.pexe</code> file, 118 not one <code>.nexe</code> file per supported architecture.</li> 119 <li><strong>Portability:</strong> Developers and users don’t need to worry about 120 already-released applications not working on new hardware: PNaCl 121 already supports all architectures NaCl does, and as PNaCl evolves it 122 gains support for new processors and fully uses their capabilities.</li> 123 </ul> 124 <p>For more details, refer to the <a class="reference internal" href="/native-client/nacl-and-pnacl.html"><em>history behind and comparison of 125 NaCl and PNaCl</em></a>.</p> 126 <h3 id="when-should-i-use-portable-native-client-instead-of-native-client">When should I use Portable Native Client instead of Native Client?</h3> 127 <p>See <a class="reference internal" href="/native-client/nacl-and-pnacl.html"><em>NaCl and PNaCl</em></a>. In short: PNaCl works on the Open 128 Web platform delivered by Chrome whereas NaCl only works on the Chrome Web 129 Store.</p> 130 <h3 id="when-should-i-use-portable-native-client-native-client">When should I use Portable Native Client / Native Client?</h3> 131 <p>The following are some typical use cases. For details, see the 132 <a class="reference internal" href="/native-client/overview.html"><em>Technical Overview</em></a>.</p> 133 <ul class="small-gap"> 134 <li>Porting existing applications or software components, written in C/C++ or 135 virtual machines written in C/C++, for use in a web application.</li> 136 <li><p class="first">Using compute-intensive applications, including threads and SIMD, such as:</p> 137 <ul class="small-gap"> 138 <li>Scientific computing.</li> 139 <li>Handling multimedia for a web application.</li> 140 <li>Various aspects of web-based games, including physics engines and AI.</li> 141 </ul> 142 </li> 143 <li>Running untrusted code on a server or within an application (such as a plugin 144 system for a game).</li> 145 </ul> 146 <p>Portable Native Client and Native Client are versatile technologies which are 147 used in many other contexts outside of Chrome.</p> 148 <h3 id="how-fast-does-code-run-in-portable-native-client">How fast does code run in Portable Native Client?</h3> 149 <p>Fast! The SPEC2k benchmarks (C, C++ and floating-point benchmarks) give 150 the following overhead for optimized PNaCl compared to regular optimized 151 LLVM:</p> 152 <table border="1" class="docutils"> 153 <colgroup> 154 </colgroup> 155 <tbody valign="top"> 156 <tr class="row-odd"><td>x86-32</td> 157 <td>15%</td> 158 </tr> 159 <tr class="row-even"><td>x86-64</td> 160 <td>25%</td> 161 </tr> 162 <tr class="row-odd"><td>ARM</td> 163 <td>10%</td> 164 </tr> 165 </tbody> 166 </table> 167 <p>Note that benchmark performance is sometimes bimodal, so different use 168 cases are likely to achieve better or worse performance than the above 169 averages. For example floating-point heavy code usually exhibits much 170 lower overheads whereas very branch-heavy code often performs worse.</p> 171 <p>Note that PNaCl supports performance features that are often used in 172 native code such as <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#language-support-threading"><em>threading</em></a> and 173 <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#portable-simd-vectors"><em>Portable SIMD Vectors</em></a>.</p> 174 <p>For details, see:</p> 175 <ul class="small-gap"> 176 <li><a class="reference external" href="https://www.youtube.com/watch?v=675znN6tntw&list=PLOU2XLYxmsIIwGK7v7jg3gQvIAWJzdat_">PNaCl SIMD: Speed on the Web</a>.</li> 177 <li><a class="reference external" href="https://nativeclient.googlecode.com/svn/data/site/NaCl_SFI.pdf">Adapting Software Fault Isolation to Contemporary CPU Architectures</a> (PDF).</li> 178 <li><a class="reference external" href="http://research.google.com/pubs/pub34913.html">Native Client: A Sandbox for Portable, Untrusted x86 Code</a> (PDF).</li> 179 </ul> 180 <p>If your code isn’t performing as close to native speed as you’d expect, 181 <a class="reference internal" href="/native-client/help.html"><em>let us know</em></a>!</p> 182 <h3 id="why-use-portable-native-client-instead-of-technology-x">Why use Portable Native Client instead of <em><technology X></em>?</h3> 183 <p>Many other technologies can be compared to Portable Native Client: 184 Flash, Java, Silverlight, ActiveX, .NET, asm.js, etc...</p> 185 <p>Different technologies have different strengths and weaknesses. In 186 appropriate contexts, Portable Native Client can be faster, more secure, 187 and/or more compatible across operating systems and architectures than 188 other technologies.</p> 189 <p>Portable Native Client complement other technologies by giving web 190 developers a new capability: the ability to run fast, secure native code 191 from a web browser in an architecture-independent way.</p> 192 <h3 id="if-i-want-direct-access-to-the-os-should-i-use-native-client">If I want direct access to the OS, should I use Native Client?</h3> 193 <p>No—Native Client does not provide direct access to the OS or devices, 194 or otherwise bypass the JavaScript security model. For more information, 195 see later sections of this FAQ.</p> 196 <h2 id="development-environments-and-tools">Development Environments and Tools</h2> 197 <h3 id="what-development-environment-and-development-operating-system-do-you-recommend">What development environment and development operating system do you recommend?</h3> 198 <p>You can develop on Windows, Mac, or Linux, and the resulting Native Client or 199 Portable Native Client application will run inside the Google Chrome browser on 200 all those platforms as well as ChromeOS. You can also develop on ChromeOS with 201 <a class="reference external" href="https://github.com/dnschneid/crouton">Crouton</a> or our <a class="reference external" href="https://www.youtube.com/watch?v=OzNuzBDEWzk&list=PLOU2XLYxmsIIwGK7v7jg3gQvIAWJzdat_">experimental development environment which runs within NaCl</a>, 202 and we’re working on self-hosting a full development environment on Portable 203 Native Client.</p> 204 <p>Any editor+shell combination should work as well as IDEs like Eclipse, 205 Visual Studio with the <a class="reference internal" href="/native-client/devguide/devcycle/vs-addin.html"><em>Native Client Add-In</em></a> on Windows, or Xcode on Mac OSX.</p> 206 <h3 id="i-m-not-familiar-with-native-development-tools-can-i-still-use-the-native-client-sdk">I’m not familiar with native development tools, can I still use the Native Client SDK?</h3> 207 <p>You may find our <a class="reference internal" href="/native-client/devguide/tutorial/index.html"><em>Tutorial</em></a> and <a class="reference internal" href="/native-client/devguide/devcycle/building.html"><em>Building 208 instructions</em></a> useful, and you can look at 209 the code and Makefiles for the SDK examples to understand how the 210 examples are built and run.</p> 211 <p>You’ll need to learn how to use some tools (like GCC, LLVM, make, Eclipse, 212 Visual Studio, or Xcode) before you can get very far with the SDK. Try seaching 213 for an <a class="reference external" href="https://www.google.com/search?q=gcc+introduction">introduction to GCC</a>.</p> 214 <h2 id="openness-and-supported-architectures-and-languages">Openness, and Supported Architectures and Languages</h2> 215 <h3 id="is-native-client-open-is-it-a-standard">Is Native Client open? Is it a standard?</h3> 216 <p>Native Client is completely open: the executable format is open and the 217 <a class="reference external" href="https://code.google.com/p/nativeclient/">source code is open</a>. Right 218 now the Native Client project is in its early stages, so it’s premature 219 to consider Native Client for standardization.</p> 220 <p>We consistenly try to document our design and implementation and hope to 221 standardize Portable Native Client when it gains more traction. A good 222 example is our <a class="reference internal" href="/native-client/reference/pnacl-bitcode-abi.html"><em>PNaCl bitcode reference manual</em></a>.</p> 223 <h3 id="what-are-the-supported-instruction-set-architectures">What are the supported instruction set architectures?</h3> 224 <p>Portable Native Client uses an architecture-independent format (the 225 <code>.pexe</code>) which can currently be translated to execute on processors 226 with the x86-32, x86-64, and ARM instruction set architectures, as well 227 as experimental support for MIPS. As new architectures come along and 228 become popular we expect Portable Native Client to support them without 229 developers having to recompile their code.</p> 230 <p>Native Client can currently execute on the same architectures as 231 Portable Native Client but is only supported on the Chrome Web 232 Store. Native Client’s <code>.nexe</code> files are architecture-dependent and 233 cannot adapt to new architectures without recompilation, we therefore 234 deem them better suited to a web store than to the open web.</p> 235 <p>With Portable Native Client we deliver a system that has comparable 236 portability to JavaScript and can adapt to new instruction set 237 architectures without requiring recompilation. The web is better when 238 it’s platform-independent, and we’d like it to stay that way.</p> 239 <h3 id="do-i-have-to-use-c-or-c-i-d-really-like-to-use-another-language"><span id="other-languages"></span>Do I have to use C or C++? I’d really like to use another language.</h3> 240 <p>Right now only C and C++ are supported directly by the toolchain in the SDK. C# 241 and other languages in the .NET family are supported via the <a class="reference external" href="https://github.com/elijahtaylor/mono">Mono port</a> for 242 Native Client. Moreover, there are several ongoing projects to support 243 additional language runtimes (e.g. <a class="reference external" href="https://code.google.com/p/naclports/source/browse#svn%2Ftrunk%2Fsrc%2Fexamples%2Ftools">naclports supports Lua, Python and Ruby</a>) 244 as well as to compile more languages to LLVM’s intermediate representation 245 (e.g. support <a class="reference external" href="http://halide-lang.org/">Halide</a>, Haskell with <a class="reference external" href="http://www.haskell.org/ghc/docs/latest/html/users_guide/code-generators.html">GHC</a> or support Fortran with <a class="reference external" href="https://flang-gsoc.blogspot.ie/2013/09/end-of-gsoc-report.html">flang</a>), or 246 transpile languages to C/C++ (source-to-source compilation).</p> 247 <p>If you’re interested in getting other languages working, please contact the 248 Native Client team by way of the <a class="reference external" href="https://groups.google.com/group/native-client-discuss">native-client-discuss</a> mailing list.</p> 249 <h3 id="do-you-only-support-chrome-what-about-other-browsers">Do you only support Chrome? What about other browsers?</h3> 250 <p>We aim to support multiple browsers. However, a number of features that 251 we consider requirements for a production-quality system that keeps the 252 user safe are difficult to implement without help from the 253 browser. Specific examples are an out-of-process plugin architecture and 254 appropriate interfaces for integrated 3D graphics. We have worked 255 closely with Chromium developers to deliver these features and we are 256 eager to collaborate with developers from other browsers.</p> 257 <h3 id="what-s-the-difference-between-npapi-and-pepper">What’s the difference between NPAPI and Pepper?</h3> 258 <p><a class="reference internal" href="/native-client/pepper_stable/index.html"><em>Pepper</em></a> (also known as PPAPI) is a new API that 259 lets Native Client modules communicate with the browser. Pepper supports 260 various features that don’t have robust support in NPAPI, such as event 261 handling, out-of-process plugins, and asynchronous interfaces. Native 262 Client has transitioned from using NPAPI to using Pepper.</p> 263 <h3 id="is-npapi-part-of-the-native-client-sdk">Is NPAPI part of the Native Client SDK?</h3> 264 <p>NPAPI is not supported by the Native Client SDK, and is <a class="reference external" href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">deprecated in Chrome</a>.</p> 265 <h3 id="does-native-client-support-simd-vector-instructions">Does Native Client support SIMD vector instructions?</h3> 266 <p>Native Client currently supports SSE on x86 and NEON on ARM. Support for 267 AVX on x86 is under way.</p> 268 <p>Portable Native Client supports portable SIMD vectors, as detailed in 269 <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#portable-simd-vectors"><em>Portable SIMD Vectors</em></a>.</p> 270 <h3 id="can-i-use-native-client-for-3d-graphics">Can I use Native Client for 3D graphics?</h3> 271 <p>Yes. Native Client supports <a class="reference external" href="https://www.khronos.org/opengles/">OpenGL ES 2.0</a>.</p> 272 <p>To alert the user regarding their hardware platform’s 3D feature set 273 before loading a large NaCl application, see <a class="reference internal" href="/native-client/devguide/coding/3D-graphics.html"><em>Vetting the driver in 274 Javascript</em></a>.</p> 275 <p>Some GL extensions are exposed to Native Client applications, see the <a class="reference external" href="https://code.google.com/p/chromium/codesearch#chromium/src/ppapi/lib/gl/gles2/gles2.c">GLES2 276 file</a>. This file is part of the GL wrapper supplied by the library 277 <code>ppapi_gles2</code> which you’ll want to include in your project. In most cases 278 extensions map to extensions available on other platforms, or differ very 279 slightly (if they differ, the extension is usually CHROMIUM or ANGLE instead of 280 EXT).</p> 281 <h3 id="does-native-client-support-concurrency-parallelism">Does Native Client support concurrency/parallelism?</h3> 282 <p>Native Client and Portable Native Client both support pthreads, 283 C11/C++11 threads, and low-level synchronization primitives (mutex, 284 barriers, atomic read/modify/write, compare-and-exchange, etc...), thus 285 allowing your Native Client application to utilize several CPU cores. 286 Note that this allows you to modify datastructures concurrently without 287 needing to copy them, which is often a limitation of shared-nothing 288 systems. For more information see <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#memory-model-and-atomics"><em>memory model and atomics</em></a> and <a class="reference internal" href="/native-client/reference/pnacl-c-cpp-language-support.html#language-support-threading"><em>threading</em></a>.</p> 289 <p>Native Client doesn’t support HTML5 Web Workers directly but can 290 interact with JavaScript code which does.</p> 291 <h2 id="coming-soon">Coming Soon</h2> 292 <h3 id="do-native-client-modules-have-access-to-external-devices">Do Native Client modules have access to external devices?</h3> 293 <p>At this time Native Client modules do not have access to serial ports, 294 camera devices, or microphones: Native Client can only use native 295 resources that today’s browsers can access. However, we intend to 296 recommend such features to the standards bodies and piggyback on their 297 efforts to make these resources available inside the browser.</p> 298 <p>You can generally think of Pepper as the C/C++ bindings to the 299 capabilities of HTML5. The goal is for Pepper and JavaScript to evolve 300 together and stay on par with each other with respect to features and 301 capabilities.</p> 302 <h2 id="security-and-privacy">Security and Privacy</h2> 303 <h3 id="what-happens-to-my-data-when-i-use-native-client">What happens to my data when I use Native Client?</h3> 304 <p>Users can opt-in to sending usage statistics and crash information in 305 Chrome, which includes usage statistics and crash information about 306 Native Client. Crashes in your code won’t otherwise send your 307 information to Google: Google counts the number of such crashes, but 308 does so anonymously without sending your application’s data or its debug 309 information.</p> 310 <p>For additional information about privacy and Chrome, see the <a class="reference external" href="https://www.google.com/chrome/intl/en/privacy.html">Google Chrome 311 privacy policy</a> and the <a class="reference external" href="https://www.google.com/chrome/intl/en/eula_text.html">Google Chrome Terms of Service</a>.</p> 312 <h3 id="how-does-native-client-prevent-sandboxed-code-from-doing-bad-things">How does Native Client prevent sandboxed code from doing Bad Things?</h3> 313 <p>Native Client’s sandbox works by validating the untrusted code (the 314 compiled Native Client module) before running it. The validator checks 315 the following:</p> 316 <ul class="small-gap"> 317 <li><strong>Data integrity:</strong> No loads or stores are permitted outside of the 318 data sandbox. In particular this means that once loaded into memory, 319 the binary is not writable. This is enforced by operating system 320 protection mechanisms. While new instructions can be inserted at 321 runtime to support things like JIT compilers, such instructions will 322 be subject to runtime verification according to the following 323 constraints before they are executed.</li> 324 <li><strong>No unsafe instructions:</strong> The validator ensures that the Native 325 Client application does not contain any unsafe instructions. Examples 326 of unsafe instructions are <code>syscall</code>, <code>int</code>, and <code>lds</code>.</li> 327 <li><strong>Control flow integrity:</strong> The validator ensures that all direct and 328 indirect branches target a safe instruction.</li> 329 </ul> 330 <p>The beauty of the Native Client sandbox is in reducing “safe” code to a 331 few simple rules that can be verified by a small trusted validator: the 332 compiler isn’t trusted. The same applies to Portable Native Client where 333 even the <code>.pexe</code> to <code>.nexe</code> translator, a simplified compiler 334 backend, isn’t trusted: it is validated before executing, and so is its 335 output.</p> 336 <p>In addition to static analysis of untrusted code, the Native Client runtime also 337 includes an outer sandbox that mediates system calls. For more details about 338 both sandboxes, see <a class="reference external" href="http://research.google.com/pubs/pub34913.html">Native Client: A Sandbox for Portable, Untrusted x86 Code</a> 339 (PDF).</p> 340 <h3 id="how-does-google-know-that-the-safety-measures-in-native-client-are-sufficient">How does Google know that the safety measures in Native Client are sufficient?</h3> 341 <p>Google has taken several steps to ensure that Native Client’s security works, 342 including:</p> 343 <ul class="small-gap"> 344 <li>Open source, peer-reviewed papers describing the design.</li> 345 <li>A <a class="reference internal" href="/native-client/community/security-contest/index.html"><em>security contest</em></a>.</li> 346 <li>Multiple internal and external security reviews.</li> 347 <li>The ongoing vigilance of our engineering and developer community.</li> 348 </ul> 349 <p>Google is committed to making Native Client safer than JavaScript and other 350 popular browser technologies. If you have suggestions for security improvements, 351 let the team know, by way of the <a class="reference external" href="https://groups.google.com/group/native-client-discuss">native-client-discuss</a> mailing list.</p> 352 <h2 id="development">Development</h2> 353 <h3 id="how-do-i-debug">How do I debug?</h3> 354 <p>Instructions on <a class="reference internal" href="/native-client/sdk/examples.html#debugging-the-sdk-examples"><em>debugging the SDK examples</em></a> using GDB are available. You can also 355 debug Native Client modules with some <a class="reference internal" href="/native-client/devguide/devcycle/debugging.html"><em>alternative approaches</em></a>.</p> 356 <h3 id="how-do-i-build-x86-32-x86-64-or-arm-nexes">How do I build x86-32, x86-64 or ARM <code>.nexes</code>?</h3> 357 <p>By default, the applications in the <code>/examples</code> folder create 358 architecture-independent <code>.pexe</code> for Portable Native Client. To 359 generate a <code>.nexe</code> targetting one specific architecture using the 360 Native Client or Portable Native Client toolchains, see the 361 <a class="reference internal" href="/native-client/devguide/devcycle/building.html"><em>Building instructions</em></a>.</p> 362 <h3 id="how-can-my-web-application-determine-which-nexe-to-load">How can my web application determine which <code>.nexe</code> to load?</h3> 363 <p>Your application does not need to make the decision of loading an 364 x86-32, x86-64 or ARM <code>.nexe</code> explicitly—the Native Client runtime 365 examines a manifest file (<code>.nmf</code>) to pick the right <code>.nexe</code> file for 366 a given user. You can generate a manifest file using a Python script 367 that’s included in the SDK (see the <code>Makefile</code> in any of the SDK 368 examples for an illustration of how to do so). Your HTML file specifies 369 the manifest filename in the <code>src</code> attribute of the <code><embed></code> 370 tag. You can see the way the pieces fit together by examining the 371 examples included in the SDK.</p> 372 <h3 id="is-it-possible-to-build-a-native-client-module-with-just-plain-c-not-c">Is it possible to build a Native Client module with just plain C (not C++)?</h3> 373 <p>Yes. See the <code>"Hello, World!"</code> in C example in the SDK under 374 <code>examples/tutorial/using_ppapi_simple/</code>, or the Game of Life example 375 under <code>examples/demo/life/life.c</code>.</p> 376 <h3 id="what-unix-system-calls-can-i-make-through-native-client">What UNIX system calls can I make through Native Client?</h3> 377 <p>Native Client doesn’t directly expose any system calls from the host OS 378 because of the inherent security risks and because the resulting 379 application would not be portable across operating systems. Instead, 380 Native Client provides portable cross-OS abstractions wrapping or 381 proxying OS functionality or emulating UNIX system calls. For example, 382 Native Client provides an <code>mmap()</code> system call that behaves much like 383 the standard UNIX <code>mmap()</code> system call.</p> 384 <h3 id="is-my-favorite-third-party-library-available-for-native-client">Is my favorite third-party library available for Native Client?</h3> 385 <p>Google has ported several third-party libraries to Native Client; such libraries 386 are available in the <a class="reference external" href="https://code.google.com/p/naclports">naclports</a> project. We encourage you to contribute 387 libraries to naclports, and/or to host your own ported libraries, and to let the 388 team know about it on <a class="reference external" href="https://groups.google.com/group/native-client-discuss">native-client-discuss</a> when you do.</p> 389 <h3 id="do-all-the-files-in-an-application-need-to-be-served-from-the-same-domain">Do all the files in an application need to be served from the same domain?</h3> 390 <p>The <code>.nmf</code>, and <code>.nexe</code> or <code>.pexe</code> files must either be served from the 391 same origin as the embedding page or an origin that has been configured 392 correctly using <a class="reference external" href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing">CORS</a>.</p> 393 <p>For applications installed from the Chrome Web Store the Web Store manifest 394 must include the correct, verified domain of the embedding page.</p> 395 <h2 id="portability">Portability</h2> 396 <h3 id="do-i-have-to-do-anything-special-to-make-my-application-run-on-different-operating-systems">Do I have to do anything special to make my application run on different operating systems?</h3> 397 <p>No. Native Client and Portable Native Client applications run without 398 modification on all supported operating systems.</p> 399 <p>However, to run on different instruction set architectures (such as 400 x86-32, x86-64 or ARM), you currently have to either:</p> 401 <ul class="small-gap"> 402 <li>Use Portable Native Client.</li> 403 <li>Build and supply a separate <code>.nexe</code> file for each architecture, and 404 make them available on the Chrome Web Store. See <a class="reference internal" href="/native-client/devguide/devcycle/building.html"><em>target 405 architectures</em></a> for details about which 406 <code>.nexe</code> files will run on which architectures.</li> 407 </ul> 408 <h3 id="how-easy-is-it-to-port-my-existing-native-code-to-native-client">How easy is it to port my existing native code to Native Client?</h3> 409 <p>In most cases you won’t have to rewrite much, if any, code. The Native 410 Client-specific tools, such as <code>pnacl-clang++</code> or <code>x86_64-nacl-g++</code>, 411 take care of most of the necessary changes. You may need to make some 412 changes to your operating system calls and interactions with external 413 devices to work with the web. Porting existing Linux libraries is 414 generally straightforward, with large libraries often requiring no 415 source change.</p> 416 <p>The following kinds of code may be more challenging to port:</p> 417 <ul class="small-gap"> 418 <li>Code that does direct TCP/IP or UDP networking. For security reasons 419 these APIs are only available to packaged applications, not on the 420 open web, after asking for the appropriate permissions. Native Client 421 is otherwise restricted to the networking APIs available in the 422 browser.</li> 423 <li>Code that creates processes, including UNIX forks. Creating processes 424 is not supported for security reasons. However, threads are supported.</li> 425 <li>Code that needs to do local file I/O. Native Client is restricted to 426 accessing URLs and to local storage in the browser (the Pepper file I/O API 427 has access to the same per-application storage that JavaScript has via Local 428 Storage). HTML5 File System can be used, among others. For POSIX compatabiliy 429 the Native Client SDK includes a library called nacl_io which allows the 430 application to interact with all these types of files via standard POSIX I/O 431 functions (e.g. open/fopen/read/write/...). See <a class="reference internal" href="/native-client/devguide/coding/nacl_io.html"><em>Using NaCl I/O</em></a> for more details.</li> 432 </ul> 433 <h2 id="troubleshooting"><span id="faq-troubleshooting"></span>Troubleshooting</h2> 434 <h3 id="my-pexe-isn-t-loading-help">My <code>.pexe</code> isn’t loading, help!</h3> 435 <ul class="small-gap"> 436 <li>You must use Google Chrome version 31 or greater for Portable Native 437 Client. Make sure you have Portable Native Client installed in 438 <code>about:nacl</code>; if not open <code>about:components</code> and “Check for 439 update” for PNaCl.</li> 440 <li>PNaCl <code>.pexe</code> must be compiled with pepper_31 SDK or higher (earlier 441 SDK versions had experimental support for PNaCl, now deprecated).</li> 442 <li>Your application can verify that Portable Native Client is supported 443 in JavaScript with <code>navigator.mimeTypes['application/x-pnacl'] !== 444 undefined</code>. This is preferred over checking the Chrome version.</li> 445 </ul> 446 <h3 id="my-nexe-files-never-finish-loading-what-gives">My <code>.nexe</code> files never finish loading. What gives?</h3> 447 <p>Here are ways to resolve some common problems that can prevent loading:</p> 448 <ul class="small-gap"> 449 <li>You must use Google Chrome version 14 or greater for Native Client.</li> 450 <li>If you haven’t already done so, enable the Native Client flag in 451 Google Chrome. Type <code>about:flags</code> in the Chrome address bar, scroll 452 down to “Native Client”, click the “Enable” link, scroll down to the 453 bottom of the page, and click the “Relaunch Now” button (all browser 454 windows will restart).</li> 455 <li>Verify that the Native Client plugin is enabled in Google Chrome. Type 456 <code>about:plugins</code> in the Chrome address bar, scroll down to “Native 457 Client”, and click the “Enable” link. (You do not need to relaunch 458 Chrome after you enable the Native Client plugin).</li> 459 <li>Make sure that the <code>.nexe</code> files are being served from a web 460 server. Native Client uses the same-origin security policy, which 461 means that modules will not load in pages opened with the <code>file://</code> 462 protocol. In particular, you can’t run the examples in the SDK by 463 simply dragging the HTML files from the desktop into the browser. See 464 <a class="reference internal" href="/native-client/devguide/devcycle/running.html"><em>Running Native Client Applications</em></a> 465 for instructions on how to run the httpd.py mini-server included in 466 the SDK.</li> 467 <li>The <code>.nexe</code> files must have been compiled using SDK version 0.5 or 468 greater.</li> 469 <li>You must load the correct <code>.nexe</code> file for your machine’s specific 470 instruction set architecture (x86-32, x86-64 or ARM). You can ensure 471 you’re loading the correct <code>.nexe</code> file by building a separate 472 <code>.nexe</code> for each architecture, and using a <code>.nmf</code> manifest file to 473 let the browser select the correct <code>.nexe</code> file. Note: the need to 474 select a processor-specific <code>.nexe</code> goes away with Portable Native 475 Client.</li> 476 <li>If things still aren’t working, <a class="reference internal" href="/native-client/help.html"><em>ask for help</em></a>!</li> 477 </ul> 478 </section> 479 480 {{/partials.standard_nacl_article}} 481