blob: 99b94dc90ae425357424ff4a731f2442fa1ef3e9 [file] [log] [blame]
Dave Cheney9cb49632014-03-24 12:34:09 +11001Native Client
2=============
3
Andrew Gerrandcfed26c2014-08-07 11:50:27 +10004This document outlines the basics of building and developing the Go runtime and
5programs in the Native Client (NaCl) environment.
Dave Cheney9cb49632014-03-24 12:34:09 +11006
Shenghou Ma08295332014-07-10 15:15:32 -04007Go 1.3 supports three architectures
Dave Cheney9cb49632014-03-24 12:34:09 +11008
9 * nacl/386 which is standard 386.
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100010 * nacl/amd64p32 which is a 64 bit architecture, where the address space is
Shenghou Ma003dccf2014-12-18 03:26:08 -050011 limited to a 4gb window.
Shenghou Ma08295332014-07-10 15:15:32 -040012 * nacl/arm which is 32-bit ARMv7A architecture with 1GB address space.
Dave Cheney9cb49632014-03-24 12:34:09 +110013
Brad Fitzpatrick2ae77372015-07-10 17:17:11 -060014For background it is recommended that you read https://golang.org/s/go13nacl.
Dave Cheney9cb49632014-03-24 12:34:09 +110015
16Prerequisites
17-------------
18
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100019Native Client programs are executed inside a sandbox, the NaCl runtime. This
20runtime must be installed before you can use NaCl programs.
Dave Cheney9cb49632014-03-24 12:34:09 +110021
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100022The NaCl distribution comes with an installer which ensures you have access to
23the latest version of the runtime. The version tracks the Chrome numbering
24scheme.
Dave Cheney9cb49632014-03-24 12:34:09 +110025
26# Download NaCl
27
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100028Download nacl_sdk.zip file from
29 https://developers.google.com/native-client/dev/sdk/download
30and unpack it. I chose /opt/nacl_sdk.
Dave Cheney9cb49632014-03-24 12:34:09 +110031
32# Update
33
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100034The zip file contains a small skeleton that can be used to download the correct
35sdk. These are released every 6-8 weeks, in line with Chrome releases.
Dave Cheney9cb49632014-03-24 12:34:09 +110036
37 % cd /opt/nacl_sdk
38 % ./naclsdk update
39
Shenghou Ma003dccf2014-12-18 03:26:08 -050040At this time pepper_40 is the stable version. The NaCl port needs at least pepper_39
41to work. If naclsdk downloads a later version, please adjust accordingly.
Dave Cheney9cb49632014-03-24 12:34:09 +110042
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100043The cmd/go helper scripts expect that the loaders sel_ldr_{x86_{32,64},arm} and
44nacl_helper_bootstrap_arm are in your path. I find it easiest to make a symlink
45from the NaCl distribution to my $GOPATH/bin directory.
Dave Cheney9cb49632014-03-24 12:34:09 +110046
Shenghou Ma003dccf2014-12-18 03:26:08 -050047 % ln -nfs /opt/nacl_sdk/pepper_39/tools/sel_ldr_x86_32 $GOPATH/bin/sel_ldr_x86_32
48 % ln -nfs /opt/nacl_sdk/pepper_39/tools/sel_ldr_x86_64 $GOPATH/bin/sel_ldr_x86_64
49 % ln -nfs /opt/nacl_sdk/pepper_39/tools/sel_ldr_arm $GOPATH/bin/sel_ldr_arm
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100050
51Additionally, for NaCl/ARM only:
52
Shenghou Ma003dccf2014-12-18 03:26:08 -050053 % ln -nfs /opt/nacl_sdk/pepper_39/tools/nacl_helper_bootstrap_arm $GOPATH/bin/nacl_helper_bootstrap_arm
Dave Cheney9cb49632014-03-24 12:34:09 +110054
55Support scripts
56---------------
57
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100058Symlink the two scripts in this directory into your $PATH, just as you did with
59NaCl sdk above.
Dave Cheney9cb49632014-03-24 12:34:09 +110060
Mikio Hara65875572014-10-01 09:16:55 +090061 % ln -nfs $GOROOT/misc/nacl/go_nacl_amd64p32_exec $GOPATH/bin/go_nacl_amd64p32_exec
62 % ln -nfs $GOROOT/misc/nacl/go_nacl_386_exec $GOPATH/bin/go_nacl_386_exec
63 % ln -nfs $GOROOT/misc/nacl/go_nacl_arm_exec $GOPATH/bin/go_nacl_arm_exec
Dave Cheney9cb49632014-03-24 12:34:09 +110064
65Building and testing
66--------------------
67
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100068Building for NaCl is similar to cross compiling for other platforms. However,
69as it is not possible to ever build in a `native` NaCl environment, the cmd/go
70tool has been enhanced to allow the full build, all.bash, to be executed,
71rather than just the compile stage, make.bash.
Dave Cheney9cb49632014-03-24 12:34:09 +110072
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100073The cmd/go tool knows that if GOOS is set to `nacl` it should not try to
74execute any binaries itself. Instead it passes their execution to a support
75script which sets up a Native Client environment and invokes the NaCl sandbox.
Dave Cheney9cb49632014-03-24 12:34:09 +110076
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100077The script's name has a special format, go_$GOOS_$GOARCH_exec, so cmd/go can
78find it.
Dave Cheney9cb49632014-03-24 12:34:09 +110079
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100080In short, if the support scripts are in place, the cmd/go tool can be used as
81per normal.
Dave Cheney9cb49632014-03-24 12:34:09 +110082
Shenghou Ma3ad9df02014-06-10 20:20:49 -040083# Build and test Go for NaCl
84
Andrew Gerrandcfed26c2014-08-07 11:50:27 +100085NaCl does not permit direct file system access. Instead, package syscall
86provides a simulated file system served by in-memory data. The script
87nacltest.bash is the NaCl equivalent of all.bash. It builds NaCl with an
88in-memory file system containing files needed for tests, and then it runs the
89tests.
Dave Cheney9cb49632014-03-24 12:34:09 +110090
91 % cd go/src
Shenghou Ma3ad9df02014-06-10 20:20:49 -040092 % env GOARCH=amd64p32 ./nacltest.bash
Dave Cheney9cb49632014-03-24 12:34:09 +110093
Dmitriy Vyukovfb0b9232014-08-15 20:51:44 +040094Debugging
95---------
96
97Assuming that you have built nacl/amd64p32 binary ./mybin and can run as:
98
99 % sel_ldr_x86_64 -l /dev/null -S -e ./mybin
100
101Create the nacl manifest file mybin.manifest with the following contents:
102
103 { "program": { "x86-64": { "url": "mybin" } } }
104
105url is the path to the binary relative to the manifest file.
106Then, run the program as:
107
108 % sel_ldr_x86_64 -g -l /dev/null -S -e ./mybin
109
110The -g flag instructs the loader to stop at startup. Then, in another console:
111
Shenghou Ma003dccf2014-12-18 03:26:08 -0500112 % /opt/nacl_sdk/pepper_39/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb
Dmitriy Vyukovfb0b9232014-08-15 20:51:44 +0400113 % nacl-manifest mybin.manifest
114 % target remote :4014
115
116If you see that the program is stopped in _rt0_amd64p32_nacl, then symbols are
117loaded successfully and you can type 'c' to start the program.
118Next time you can automate it as:
119
Shenghou Ma003dccf2014-12-18 03:26:08 -0500120 % /opt/nacl_sdk/pepper_39/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb \
Dmitriy Vyukovfb0b9232014-08-15 20:51:44 +0400121 -ex 'nacl-manifest mybin.manifest' -ex 'target remote :4014'