Open kawasin73 opened 5 years ago
Travis CI でのパッケージのインストールは apt-get
を利用する
qemu-user-static
は以下のようにインストールする
sudo apt-get update
sudo apt-get install -y qemu-user-static
Go 言語がサポートしている GOARCH は以下の通り
# go tool dist list | grep linux
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/s390x
このうち Big Endian なのは、ppc64
、 mips
、 mips64
、s390x
のみ。
memory ordering is big-endian and wrong typecasting between pointers to integers of different size can cause fatal errors https://fedoraproject.org/wiki/Architectures/s390x
ppc64
で行った場合以下のエラーが発生したため、ppc64
は断念。
$ qemu-ppc64-static ./bitset.test
Invalid instruction
NIP 000000000004a1f4 LR 000000000004a1b0 CTR 0000000000063c20 XER 0000000000000000
MSR 8000000002006000 HID0 0000000060000000 HF 0000000002006000 idx 0
TB 00000000 00000000
GPR00 0000000000000000 00000040008005d8 0000000000000000 0000000000000001
GPR04 0000004000800621 fffffffffffffff0 0000000000000001 0000000000000001
GPR08 0000000000000001 0000000000000000 0000000000000000 0000000000000000
GPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR28 0000000000000000 0000000000000000 00000000001f8da0 000000000004a1b0
CR 20000000 [ E - - - - - - - ] RES ffffffffffffffff
FPR00 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR04 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR08 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR28 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPSCR 0000000000000000
qemu: uncaught target signal 4 (Illegal instruction) - core dumped
Illegal instruction (core dumped)
mips64
の場合 Go 1.10
では成功する。
しかし、Go 1.9
の場合以下のエラーが発生する
$ qemu-mips64-static ./bitset.test -test.v
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
/home/travis/.travis/job_stages: line 104: 5910 Segmentation fault (core dumped) qemu-mips64-static ./bitset.test -test.v
The command "qemu-mips64-static ./bitset.test -test.v" exited with 139.
Go 1.11
の場合以下のエラーが発生する
0.02s$ qemu-mips64-static ./bitset.test -test.v
fatal error: sigaction failed
runtime stack:
runtime.throw(0x179647, 0x10)
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/panic.go:608 +0x6c
runtime.sysSigaction.func1()
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/os_linux.go:432 +0x4c
runtime.sysSigaction(0x4100000041, 0x40007ff478, 0x0)
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/os_linux.go:431 +0x98
runtime.sigaction(0x4100074be0, 0x40007ff478, 0x0)
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/sigaction.go:15 +0x28
runtime.setsig(0x4100000000, 0x59f90)
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/os_linux.go:382 +0xe8
runtime.initsig(0x183b00047a8c)
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/signal_unix.go:113 +0x268
runtime.mstartm0()
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:1309 +0x60
runtime.mstart1()
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:1278 +0x13c
runtime.mstart()
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:1248 +0x68
goroutine 1 [runnable]:
runtime.main()
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/proc.go:110
runtime.goexit()
/home/travis/.gimme/versions/go1.11.linux.amd64/src/runtime/asm_mips64x.s:649 +0x4
The command "qemu-mips64-static ./bitset.test -test.v" exited with 2.
Little Endian と Big Endian のエミュレート #5 を github.com/multiarch/qemu-user-static からダウンロードした
qemu-ppc64-static
バイナリを利用することによって行った。ただし、このリポジトリ自体の信頼性の問題もあるため、パッケージマネージャーによってダウンロードする方法を検討する。