GOで徒労しちゃった
ママチャリでお使いに出たら、前を行くチャリの人と同期が取れてしまった。着かず離れず 自分と同じスピードで走ってる人に付いて行くのは楽でいいわいと思った。と、信号待ちで 追いついて、そのまま後ろで待機。
信号が青になって、前のチャリが進み始めるかと思ったんだけど、一向にそのそぶりが無い。 ベルを鳴らして教えてあげようかと思ったけど、止めた。だって、ふと自転車の後輪カバーを 見たら、地元ではガラの悪さでは定評があるXX高校の乗り入れ許可証が貼ってあるんだもん。
追い越し際にそっと見ると、携帯に夢中でした。携帯するなら道の横に避けてやれよ。 この地域は実にさまざまなチャリの乗り方をしてる人が居るので、笑える。
走りながら携帯してる馬鹿。 ビール缶片手にチャリに乗ってる、おっさん。だれが見たって、飲酒運転実行中でっせ。 傘を片手に曲芸乗りするおばさん。昼間でも、ライト点灯で走ってる中学生。これって、バイQ の予行演習?イージーライダー予備軍だか何だか知らんが、ハンドルを改造してカッコ付けてる 餓鬼共。
夜間無灯火で、携帯の青白い光だけが不気味によってくる、会社帰りのおねーちゃん。 これって、まじに怖いわ。
地域のおまわりさんは、こういうのは全部見なかった事にしてます。で、何を注意するかと 言うと、前かごにバックを入れて走ってるおばさん。ひったくりが多いから、蓋付きの かごにしてください ですって。怖い所だ事。
FreeBSDで碁は動かんか?
もう一度、整理の意味で、FreeBSD上でgoしてみる。今回は、テストスウィーツ(甘いんか)から 適当に取ってきたやつだ。ソースの冒頭に注目。変数を適当に設定すれば、自動化できるよって 書いてあるね。こういうの、好きだわさ。
[sakae@nil ~/work]$ cat printbig.go // $G $F.go && $L $F.$A && ./$A.out // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main func main() { print(-(1<<63), "\n"); print((1<<63)-1, "\n") } [sakae@nil ~/work]$ 8g printbig.go [sakae@nil ~/work]$ 8l printbig.8 [sakae@nil ~/work]$ ls -l total 76 -rwxr-xr-x 1 sakae kuma 71409 Nov 17 10:05 8.out* -rw-r--r-- 1 sakae kuma 2674 Nov 17 10:05 printbig.8 -rw-r--r-- 1 sakae kuma 275 Nov 17 10:04 printbig.go [sakae@nil ~/work]$ ./8.out bash: ./8.out: cannot execute binary file
当たり前だけど、前回と同じ結果になった。一体、FreeBSDは、この異物をどう認識してるん? そのあたりから見てきますかね。
[sakae@nil ~/work]$ file 8.out 8.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped [sakae@nil ~/work]$ file /bin/ls /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.2 (702100), dynamically linked (uses shared libs), FreeBSD-style, stripped
参考のためにBSD備え付けも列挙しました。これを見ると、8.out ってのは、SYSVとスタンプ された異界のもののようです。だから、そんな異物は実行出来ないと拒否されたのね。了解です。 (勝手に了解されちゃ、困るんです)
いろいろとぐぐってみるとFreeBSD・Linux・商用UNIXの違いに 到達。そっか、Linuxってベル研に近いんだ。そして、SYSV を実行するには、
options COMPAT_SVR4 # build emulator statically
したカーネルを作っておいて、SolarisのCDを取り寄せてという 頑張り屋さんまで行き着いてしまった。 残念ながら、おいらSolarisなんて持ってないもんね。諦める鹿。
で、更にうろうろしていると、elfファイルにもブランドがあるなんて記述を見つけた。
[sakae@nil ~/work]$ brandelf 8.out File '8.out' is of brand 'SVR4' (0).
ブランドを偽る事も得意にしてるらしい。(って、あの国の方の提供でしょうか?)ベル研と ペンギン君は同盟関係にあるみたいなんで、ペンギン君と名乗ったら、ひょっとして通して くれるんじゃ? FreeBSDの実機には、Linuxの振りを出来るように仕込んでるので、試して みる。
[sakae@fb /etc/rc.d]$ sudo ./abi start Additional ABI support: linux . [sakae@fb ~/work]$ brandelf -t Linux 8.out [sakae@fb ~/work]$ brandelf 8.out File '8.out' is of brand 'Linux' (3). [sakae@fb ~/work]$ file 8.out 8.out: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked (uses shared libs), stripped [sakae@fb ~/work]$ ./8.out -bash: ./8.out: cannot execute binary file
やっぱり、偽ブランドは動かんなあ。厳しいお目付け役はどこに居るん? 探してみると src/sys/kern/imgact_elf.c らしい。
ああ、ここを読むとちと 仕組みが見えてきた。骨折り損だったって事がよく分かったわい。
そんじゃ、、
FreeBSDとは親戚関係にあるMACだと、動くんかいな? と、性懲りもなくやってみます。
%%%% making libcgo %%%% gcc -m32 -O2 -fPIC -o darwin_386.o -c darwin_386.c gcc -m32 -O2 -fPIC -o 386.o -c 386.S gcc -m32 -O2 -fPIC -o util.o -c util.c gcc -m32 -dynamiclib -Wl,-undefined,dynamic_lookup /usr/lib/libpthread.dylib -o libcgo.so darwin_386.o 386.o util.o gcc: /usr/lib/libpthread.dylib: No such file or directory make: *** [libcgo.so] Error 1
惜しいなあ、ファイルがあれば何とかなったかも。(ならない度、99.9%以上だよ) でもね、go/binの下を見たら、8gとか8lが出来ていたんだ。だから、一応テストしてみる。
[sakae@nil ~/work]$ ./8.out bash: ./8.out: cannot execute binary file [sakae@nil ~/work]$ file 8.out 8.out: Mach-O executable i386 [sakae@nil ~/work]$ ls -l total 86 -rwxr-xr-x 1 sakae kuma 80437 Nov 17 10:44 8.out* -rw-r--r-- 1 sakae kuma 2674 Nov 17 10:44 printbig.8 -rw-r--r-- 1 sakae kuma 275 Nov 17 10:04 printbig.go
コンパイルもリンクも出来てバイナリーが出来上がっているけど、やっぱり実行は 出来なかった。残念無念。
そんじゃ、最後の悪あがき、共有ライブラリーは諦めて、GOOS=nacl でやってみる。リンカー コマンドまでは作成されたので、実行してみる。
bash: ./8.out: cannot execute binary file [sakae@nil ~/work]$ file 8.out 8.out: ELF 32-bit LSB executable, Intel 80386, version 1, statically linked, stripped [sakae@nil ~/work]$ ls -ltr total 88 -rw-r--r-- 1 sakae kuma 275 Nov 17 10:04 printbig.go -rw-r--r-- 1 sakae kuma 2674 Nov 17 11:58 printbig.8 -rwxr-xr-x 1 sakae kuma 82936 Nov 17 11:59 8.out*
でも待てよ、スタチックリンクして出来たバイナリーサイズと、普通?にLinuxモードで作った ファイルサイズが同じぐらいだよ。って、事はfileコマンドが嘘を言ってる?
[sakae@fb ~/work]$ ldd 8.out 8.out: ldd: 8.out: Exec format error 8.out: exit status 1
やっぱり騙されていたみたいだ。そんじゃ、ふつパイラで覚えたコマンドを駆使してみっかな。
[sakae@fb ~/work]$ objdump -a 8.out 8.out: file format elf32-i386-freebsd 8.out
これは駄目だな。後、何だっけかな?
[sakae@fb ~/work]$ readelf -a 8.out |lv ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x80488b0 Start of program headers: 52 (bytes into file) Start of section headers: 308 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 15 Section header string table index: 14 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 0804f824 007824 000014 00 A 0 0 1 [ 2] .got PROGBITS 0804f024 007024 000000 04 WA 0 0 4 [ 3] .got.plt PROGBITS 0804f054 007054 000000 04 WA 0 0 4 [ 4] .dynsym DYNSYM 0804f7cc 0077cc 000010 10 A 5 0 4 [ 5] .dynstr STRTAB 0804f020 007020 000004 00 A 0 0 1 [ 6] .hash HASH 08050e5c 008e5c 000010 04 A 4 0 4 [ 7] .rel REL 0804f024 007024 000000 08 A 4 0 4 [ 8] .dynamic DYNAMIC 08050610 008610 000048 08 WA 5 0 4 [ 9] .text PROGBITS 08048800 000800 006551 00 AX 0 0 4 [10] .data PROGBITS 0804f000 007000 002660 00 WA 0 0 4 [11] .bss NOBITS 08051660 009660 00b400 00 WA 0 0 4 [12] .gosymtab PROGBITS 00000000 00a008 006620 00 0 0 1 [13] .gopclntab PROGBITS 00000000 010628 00102a 00 0 0 1 [14] .shstrtab STRTAB 0804f1ac 0071ac 00006c 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x1000 INTERP 0x007824 0x0804f824 0x0804f824 0x00014 0x00014 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] LOAD 0x000800 0x08048800 0x08048800 0x06551 0x06551 R E 0x1000 LOAD 0x007000 0x0804f000 0x0804f000 0x02660 0x0da60 RW 0x1000 LOAD 0x00a000 0x99000000 0x99000000 0x07652 0x07652 RW 0x1000 DYNAMIC 0x008610 0x08050610 0x08050610 0x00048 0x00048 RW 0x4 TLS 0x000000 0x00000000 0x00000000 0x00000 0x00008 R 0x4 STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 :
readelfでそれなりに表示してくれて、objdump が駄目と言うのは、怪しさ満載。 エイリアンファイルですよ。更に、エラーに目を凝らすと
[sakae@fb ~/work]$ ./8.out -bash: ./8.out: cannot execute binary file [sakae@fb ~/work]$ /bin/sh $ ./8.out ./8.out: 1: Syntax error: "(" unexpected $ exit [sakae@fb ~/work]$ /bin/tcsh sakae@FB /home/sakae/work> ./8.out ./8.out: Exec format error. Binary file not executable.
bashでもshでもtcshでも、ちゃんとエイリアンファイルを弾いてくれているよ。どういう チェックをしてくてるか、調べてみるのも楽しいかな。
もういいや、このぐらいにしておこう。最後にネットではいろいろお祭りが行われて いるみたいなので、傍観して終わりにします。
翻訳サイトが出来ていたり、 個人的Go雑感&メモがあったり、 言語対決したり たらいを回す人が居たり、みんな好きでんなぁ。