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