興味本位でGo言語に触れてみようと思う。Linuxで32bit実行ファイルを生成して32bit shared libraryを呼び出すってしてみる。
まず32bit shared libraryを生成せんと動作確認できないので、32bit shared libraryつくる。まずは32bitでビルドできる環境を用意せんといかんのだが、
sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib
でいいらしい。
で、コンパイルとリンク時に-m32をオプションとして与えんといかんので、Makefileをいじる
Makefile
- CC = gcc
- CFLAGS = -m32 -fPIC -O4 -Wall -I/usr/local/include
- LDFLAGS+= -m32 -shared -Wl,--version-script,libkeeloq.map
- #LDFLAGS= -shared -static-libgcc -static-libstdc++ -Wl,--version-script,libkeeloq.map -o libkeeloq.so
- libkeeloq.so: keeloq.o
- $(CC) keeloq.o $(LDFLAGS) -o libkeeloq.so
-
- keeloq.o: keeloq.c
- $(CC) $(CFLAGS) keeloq.c -c -o keeloq.o
-
- clean:
- rm keeloq.o libkeeloq.so
make clean
make
で、テスト用コードをコンパイルして実行。
rm a.out
gcc -m32 keeloq_call.c
./a.out
と、こうなる
ので、実行できてるんやけど、これが本当に32bitかどうか、、、
file -e elf a.out
file -e elf libkeeloq.so
ってやればいいらしい。で、
こうなるので、うまくいっているはず。
で、Goで32ビットアプリを生成するには、、、これが、なかなかわからんかったけど、こうやる
CGO_ENABLED=1 GOOS=linux GOARCH=386 go run callshared32.go
GOOSとGOARCHを設定するってのはすぐに見つかるんだけど、CGO_ENABLEDはなかなか見つからんかった。これ指定しないと、
go: no Go source files
っていう本当に理解できないエラーが返される。、、、こんなんダメやろって思うんやけど、、、
で、こうなる。
buildもしてみる。
まぁ、うまくいっているね。
Goはクロスコンパイルが簡単だってどっかに書いてあったけど、なぞの呪文系は情報が錯綜しがちなのでやっかいなんよね、、、
そういっても、モノ相手なので、いつか解決してスッキリする。ヒト相手に困惑するのよりぜんぜん平気。エブリデーエンジニアになりたい。
0 件のコメント:
コメントを投稿