はじめに
この記事は、@kjunichiの2014年パーソナルアドベントカレンダーの3日目の記事です。
h2oに対して、http2に対応した、速いサーバーという程度の認識しか持ち合わせていません。お金に困っています。
libh2oの記事を読んで学んだこと
記事見てGoで動かせそうと思った
libopencv_highguiをRustやGoから使えるから、このノリで、2015年も注目間違いなしの話題のhttp2に対応しているh2oをRustやGoから使う記事書いたらとんでもない数のページビューとれて、おれも好きな事で食べているやつらの仲間入り!と考えた。
Rustはlibuvを使っていることを知っていたので、混ぜるな危険系かと用心して、Goでやることにした。。
いずれにせよ、libh2o.aではFFIが使えないから
ちょっとまて
折角だからlibh2o.aをdylib化するところまでくらいやろう!
dylib作るまでの道のり
これも厳しかった。Makefile苦手なのにcmakeなんていじれるわけがない。clangになってるから、gccの例を見つけてもNG。
libh2o.aからlibh2o.dylibを作る
*.oファイルにバラす
arコマンドで出来る
ar x libh2o.a
libtoolで.oファイルから.dylibの作成が可能
libtool -dynamic -flat_namespace -o libh2o.dylib -undefined dynamic *.o
simple.cをビルドする
cc -I ../../deps/klib -I ../../include -I ../../deps/picohttpparser -I ../../deps/yoml -I $HOME/local/include -L $HOME/local/lib simple.c -lh2o -luv -lcrypto -lssl -o simple
うごかない
dyld: Library not loaded: libh2o.dylib Referenced from: /Users/kjunichi/local/src/h2o/examples/libh2o/./simple Reason: image not found Trace/BPT trap: 5
otool -L するとなぜかlibh2o.dylibだけフルパスで表示されない!
otool -L simple simple: libh2o.dylib (compatibility version 0.0.0, current version 0.0.0) /Users/kjunichi/local/stow/libuv-1.0.1/lib/libuv.1.dylib (compatibility version 2.0.0, current version 2.0.0) /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8) /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
どうも、dylibファイルに自身の格納場所情報が含まれていて、これがリンク時に実行バイナリに反映されるっぽい
install_name_toolなるものがある
dylibファイルのこの格納場所情報的なものなどを編集できるツールの模様
install_name_tool -id $HOME/local/lib $HOME/local/lib/libh2o.dylib
うごいた
curl -vv http://localhost:7890/ * Hostname was NOT found in DNS cache * Trying ::1... * connect to ::1 port 7890 failed: Connection refused * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 7890 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.37.1 > Host: localhost:7890 > Accept: */* < HTTP/1.1 404 File Not Found < date: Tue, 02 Dec 2014 07:13:45 GMT * Server h2o/0.1 is not blacklisted < server: h2o/0.1 < connection: close < content-type: text/plain; charset=utf-8 * Closing connection 0
すでにある実行ファイルが参照しているdylibファイルを移動したいとき
実行ファイル:hoo依存ライブラリ:/path/to/old_place/libhoge.dylib
mv libhoge.dylib /path/to/new_place/ install_name_tool -change /path/to/old_place/libhoge.dylib /path/to/new_place/libhoge.dylib hoo install_name_tool -id /path/to/new_place/libhoge.dylib /path/to/new_place/libhoge.dylib
simple.cを読んで
https://github.com/h2o/h2o/blob/master/examples/libh2o/simple.c
libuvを思いっきり使ってるじゃん。
つまり、libuvのAPIもせっせとRustやGoでインポートしないといけない。
まぁ、GoだとRustよりは簡単に書けはするが、ちょっとハードル高いじゃないかと
次回につづく。。といいなぁ
まとめ
- libhoge.aから.dylibが作れることが分かった
- dylibファイルは動かすのには注意が必要
- dylibファイルは作成時にどこに置くか決まっていないと後で面倒
- dylib化出来たから、頑張ればnode.jsでもh2oを動かせるハズ
- アプリケーションバンドル形式なアプリなら@executable_pathを指定するなど、相対的にパスの指定が可能
- cgoだとlibhoge.aでも行ける模様
Link
ttanimu engineering labs: 静的ライブラリから動的ライブラリを作る
osx - How do I modify the install name of a .dylib at build time - Stack Overflow
https://github.com/shadowmint/go-static-linking
関連記事
- OSXでDYLD_LIBRARY_PATHを設定する意味がわからない
- GoでFaceTime HDカメラやWebカメラを使う
- http2 ハッカソン #5に行ってきた
- Cygwinでh2oが動いた日
- EC-CUBEをh2oと連携させてdocker for macで動かしてosxfsが大変遅いことを体感した件