蓝天,小湖,湖水中一方小筑

Some failed attempts on PNaCl

Google has released his [PNaCl](http://www.chromium.org/nativeclient/pnacl /building-and-testing-portable-native-client) project on Google I/O 2013, which can allow user to write portable native client application. The portable native client application can be translated to native client program and executed on supported architecture.

The official toolchain contains clang frontend, which can only be used to compile C/C++ code to PNaCl application. But the PNaCl application is a subset of LLVM so I have tried some other languages have LLVM frontend. I am still working on the solution, and this article is just recording some failed attempts.

Install PNaCl toolchain

PNaCl toolchain can be downloaded via Native Client SDK, please follow the instruction for downloading and installing. Here are the commands used here:

  • ./naclsdk install pepper_canary
  • export NACL_SDK_ROOT=/where/you/put/the/pepper_canary
  • cd pepper_canary/examples/hello_world; TOOLCHAIN=pnacl CONFIG=Release make

Chrome is also needed some setup, which also can be found in that page. NOTICE that the #enable-nacl-debug flag can not be enabled, or the PNaCl application will not be able to loaded([ref](http://www.ahwkong.com/post/43309281489/native-client-see-only- status-creating-embed)).

The samples are also avaliable in chrome store, and the link can also be found on [this page](http://www.chromium.org/nativeclient/pnacl/building-and- testing-portable-native-client).

Golang and llgo

The first language I tried is Golang. There is a Golang frontend for LLVM called llgo, and I have tried to use it for generating LLVM bitcode from Golang program.

go get is recommended to install the llgo package. The CGO_CFLAGS and CGO_LDFLAGS should be set before executing go get. I have followed the steps on the [author’s blog](http://blog.awilkins.id.au/2013/05/llgo-on- go-11.html) for installing:

  • Install Go 1.1
  • Get PNaCl sdk, which contains Clang and LLVM
  • Run go get github.com/axw/llgo/cmd/llgo-dist
  • Run llgo-dist to build and install runtime

I was tried it on MacOS 10.7.5, but got the error message said No matching .ll file for "asm_darwin_amd64.s", I have filed an issue and learned from response that I can set target triple to x86_64-apple-macosx10.7.0 or i386-apple- macosx10.7.0 for solving this.

I have met compile error while compiling runtime by llgo-dist command, which seems because of upgrade of golang to 1.1. So I leave llgo there and waiting for some updates from author.

Ruby

Another attempt is ruby. In ruby 2.0.0, the nacl support has been integrated, the document can be found [here](https://github.com/csigi/learning ruby/blob/master/ruby2/ruby-2.0.0-rc1/nacl/README.nacl). During compiling the ruby source, I have got an rdoc error, so I added --disable-install-rdoc to the configue command.

$ ./configure --prefix=/tmp/nacl-ruby --host=x86_64-nacl --with-baseruby=`which ruby` --disable-install-rdoc

Also I made a symbol link of all directories in includes PNaCl sdk directory to ruby for solving header file not found error.

$ ln -s /home/vagrant/source/nacl_sdk/pepper_canary/include/* ./

If running this command on 64-bit OS, please make sure the 32-bit glibc library is installed, or some binaries may get error.

I have compiled the native executable for ruby, but it can’t be executed by PNaCl binary. I am still investigating on this.

Next step

I am still trying to write portable native client code with other languages. I saw the author of llgo has made some changes and I will do the test. I will update my post when got progress.