diff options
Diffstat (limited to 'misc/nacl')
-rw-r--r-- | misc/nacl/README | 97 | ||||
-rwxr-xr-x | misc/nacl/go_nacl_arm_exec | 10 | ||||
-rw-r--r-- | misc/nacl/mkzip.go | 10 | ||||
-rw-r--r-- | misc/nacl/testzip.proto | 164 |
4 files changed, 180 insertions, 101 deletions
diff --git a/misc/nacl/README b/misc/nacl/README index 9cc2bda60..72d0e08ad 100644 --- a/misc/nacl/README +++ b/misc/nacl/README @@ -1,63 +1,122 @@ Native Client ============= -This document outlines the basics of building and developing the Go runtime and programs in the Native Client (NaCl) environment. +This document outlines the basics of building and developing the Go runtime and +programs in the Native Client (NaCl) environment. -Go 1.3 supports two architectures +Go 1.3 supports three architectures * nacl/386 which is standard 386. - * nacl/amd64p32 which is a 64 bit architecture, where the address space is limited to a 4gb window. + * nacl/amd64p32 which is a 64 bit architecture, where the address space is + limited to a 4gb window. + * nacl/arm which is 32-bit ARMv7A architecture with 1GB address space. For background it is recommended that you read http://golang.org/s/go13nacl. Prerequisites ------------- -Native Client programs are executed inside a sandbox, the NaCl runtime. This runtime must be installed before you can use NaCl programs. +Native Client programs are executed inside a sandbox, the NaCl runtime. This +runtime must be installed before you can use NaCl programs. -The NaCl distribution comes with an installer which ensures you have access to the latest version of the runtime. The version tracks the Chrome numbering scheme. +The NaCl distribution comes with an installer which ensures you have access to +the latest version of the runtime. The version tracks the Chrome numbering +scheme. # Download NaCl -Download nacl_sdk.zip file from https://developers.google.com/native-client/dev/sdk/download, and unpack it. I chose /opt/nacl_sdk +Download nacl_sdk.zip file from + https://developers.google.com/native-client/dev/sdk/download +and unpack it. I chose /opt/nacl_sdk. # Update -The zip file contains a small skeleton that can be used to download the correct sdk. These are released every 6-8 weeks, in line with Chrome releases. +The zip file contains a small skeleton that can be used to download the correct +sdk. These are released every 6-8 weeks, in line with Chrome releases. % cd /opt/nacl_sdk % ./naclsdk update -At this time pepper_33 is the stable version. If naclsdk downloads a later version, please adjust accordingly. +At this time pepper_34 is the stable version. If naclsdk downloads a later +version, please adjust accordingly. As of June 2014, only the canary sdk +provides support for nacl/arm. -The cmd/go helper scripts expect that the runtime loaders, sel_ldr_x86_{32,64} are in your path. I find it easiest to make a symlink from the NaCl distribution to my $GOPATH/bin directory. +The cmd/go helper scripts expect that the loaders sel_ldr_{x86_{32,64},arm} and +nacl_helper_bootstrap_arm are in your path. I find it easiest to make a symlink +from the NaCl distribution to my $GOPATH/bin directory. - % ln -nfs /opt/nacl_sdk/pepper_33/tools/sel_ldr_x86_32 $GOPATH/bin/sel_ldr_x86_32 - % ln -nfs /opt/nacl_sdk/pepper_33/tools/sel_ldr_x86_64 $GOPATH/bin/sel_ldr_x86_64 + % ln -nfs /opt/nacl_sdk/pepper_34/tools/sel_ldr_x86_32 $GOPATH/bin/sel_ldr_x86_32 + % ln -nfs /opt/nacl_sdk/pepper_34/tools/sel_ldr_x86_64 $GOPATH/bin/sel_ldr_x86_64 + % ln -nfs /opt/nacl_sdk/pepper_canary/tools/sel_ldr_arm $GOPATH/bin/sel_ldr_arm + +Additionally, for NaCl/ARM only: + + % ln -nfs /opt/nacl_sdk/pepper_canary/tools/nacl_helper_bootstrap_arm $GOPATH/bin/nacl_helper_bootstrap_arm Support scripts --------------- -Symlink the two scripts in this directory into your $PATH, just as you did with NaCl sdk above. +Symlink the two scripts in this directory into your $PATH, just as you did with +NaCl sdk above. - % ln -nfs $GOROOT/go/misc/nacl/go_nacl_amd64p32_exec $GOPATH/bin/go_nacl_amd64p32_exec - % ln -nfs $GOROOT/go/misc/nacl/go_nacl_386_exec $GOPATH/bin/go_nacl_386_exec + % ln -nfs $GOROOT/misc/nacl/go_nacl_amd64p32_exec $GOPATH/bin/go_nacl_amd64p32_exec + % ln -nfs $GOROOT/misc/nacl/go_nacl_386_exec $GOPATH/bin/go_nacl_386_exec + % ln -nfs $GOROOT/misc/nacl/go_nacl_arm_exec $GOPATH/bin/go_nacl_arm_exec Building and testing -------------------- -Building for NaCl is similar to cross compiling for other platforms. However, as it is not possible to ever build in a `native` NaCl environment, the cmd/go tool has been enhanced to allow the full build, all.bash, to be executed, rather than just the compile stage, make.bash. +Building for NaCl is similar to cross compiling for other platforms. However, +as it is not possible to ever build in a `native` NaCl environment, the cmd/go +tool has been enhanced to allow the full build, all.bash, to be executed, +rather than just the compile stage, make.bash. -The cmd/go tool knows that if GOOS is set to `nacl` it should not try to execute any binaries itself. Instead it passes their execution to a support script which sets up a Native Client environment and invokes the NaCl sandbox. +The cmd/go tool knows that if GOOS is set to `nacl` it should not try to +execute any binaries itself. Instead it passes their execution to a support +script which sets up a Native Client environment and invokes the NaCl sandbox. -The script's name has a special format, go_$GOOS_$GOARCH_exec, so cmd/go can find it. +The script's name has a special format, go_$GOOS_$GOARCH_exec, so cmd/go can +find it. -In short, if the support scripts are in place, the cmd/go tool can be used as per normal. +In short, if the support scripts are in place, the cmd/go tool can be used as +per normal. # Build and test Go for NaCl -NaCl does not permit direct file system access. Instead, package syscall provides a simulated file system served by in-memory data. The script nacltest.bash is the NaCl equivalent of all.bash. It builds NaCl with an in-memory file system containing files needed for tests, and then it runs the tests. +NaCl does not permit direct file system access. Instead, package syscall +provides a simulated file system served by in-memory data. The script +nacltest.bash is the NaCl equivalent of all.bash. It builds NaCl with an +in-memory file system containing files needed for tests, and then it runs the +tests. % cd go/src % env GOARCH=amd64p32 ./nacltest.bash +Debugging +--------- + +Assuming that you have built nacl/amd64p32 binary ./mybin and can run as: + + % sel_ldr_x86_64 -l /dev/null -S -e ./mybin + +Create the nacl manifest file mybin.manifest with the following contents: + + { "program": { "x86-64": { "url": "mybin" } } } + +url is the path to the binary relative to the manifest file. +Then, run the program as: + + % sel_ldr_x86_64 -g -l /dev/null -S -e ./mybin + +The -g flag instructs the loader to stop at startup. Then, in another console: + + % /opt/nacl_sdk/pepper_34/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb + % nacl-manifest mybin.manifest + % target remote :4014 + +If you see that the program is stopped in _rt0_amd64p32_nacl, then symbols are +loaded successfully and you can type 'c' to start the program. +Next time you can automate it as: + + % /opt/nacl_sdk/pepper_34/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb \ + -ex 'nacl-manifest mybin.manifest' -ex 'target remote :4014' diff --git a/misc/nacl/go_nacl_arm_exec b/misc/nacl/go_nacl_arm_exec new file mode 100755 index 000000000..4275cb111 --- /dev/null +++ b/misc/nacl/go_nacl_arm_exec @@ -0,0 +1,10 @@ +#!/bin/bash + +eval $(go env) + +export NACLENV_GOARCH=$GOARCH +export NACLENV_GOOS=$GOOS +export NACLENV_GOROOT=/go +export NACLENV_NACLPWD=$(pwd | sed "s;$GOROOT;/go;") + +exec nacl_helper_bootstrap_arm $(which sel_ldr_arm) --reserved_at_zero=0xXXXXXXXXXXXXXXXX -l /dev/null -S -e "$@" diff --git a/misc/nacl/mkzip.go b/misc/nacl/mkzip.go index 7b2de7d47..aaf37f120 100644 --- a/misc/nacl/mkzip.go +++ b/misc/nacl/mkzip.go @@ -71,7 +71,13 @@ func main() { var w io.Writer = zf if *gopackage != "" { - fmt.Fprintf(zf, "package %s\n\nfunc init() {\n\tunzip(\"", *gopackage) + fmt.Fprintf(zf, `package %s +import "sync" +func init() { + var once sync.Once + fsinit = func() { + once.Do(func() { + unzip("`, *gopackage) gw := &goWriter{b: bufio.NewWriter(w)} defer func() { if err := gw.Close(); err != nil { @@ -214,7 +220,7 @@ func (w *goWriter) Write(b []byte) (int, error) { } func (w *goWriter) Close() error { - fmt.Fprintf(w.b, "\")\n}\n") + fmt.Fprintf(w.b, "\")\n\t\t})\n\t}\n}") w.b.Flush() return nil } diff --git a/misc/nacl/testzip.proto b/misc/nacl/testzip.proto index 2701ff463..07d4a1db0 100644 --- a/misc/nacl/testzip.proto +++ b/misc/nacl/testzip.proto @@ -10,101 +10,105 @@ usr src=../misc/nacl/testdata go src=.. src cmd + internal + objfile + objfile.go gofmt + gofmt.go + gofmt_test.go testdata + - pkg - archive - tar - testdata - + - zip - testdata - + - compress - bzip2 - testdata - + - flate - gzip - testdata - + - lzw - testdata - + - zlib - crypto - rsa - testdata - + - tls - testdata - + - debug - dwarf - testdata - + - elf - testdata - + - macho - testdata - + - pe - testdata - + - plan9obj - testdata - + - go - build - + - doc - testdata - + - format - + - parser - + - printer - + - image - testdata - + - draw - gif - jpeg - png - testdata - + - io + archive + tar + testdata + + + zip + testdata + + + compress + bzip2 + testdata + + + flate + gzip + testdata + + + lzw + testdata + - mime + zlib + crypto + rsa + testdata + + + tls + testdata + + + debug + dwarf + testdata + + + elf + testdata + + + macho testdata + - multipart - testdata - + - net - http + pe + testdata + + plan9obj testdata + - os + go + build + - path - filepath + doc + testdata + - regexp + format + + + parser + + + printer + + + image + testdata + + + draw + gif + jpeg + png testdata + - strconv + io + + + mime + testdata + + + multipart + testdata + + + net + http + + + testdata + + + os + + + path + filepath + + + regexp + testdata + + + strconv + testdata + + + text + template testdata + - text - template - testdata - + lib time zoneinfo.zip |