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雑感&メモがあったり、 言語対決したり たらいを回す人が居たり、みんな好きでんなぁ。

最後の最後に あんな人こんな人の 元気なお顔を拝見して、お開きにします。