読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

俺がlibh2oの記事を読んで学んだこと #osx #dylib

はじめに

この記事は、@kjunichiの2014年パーソナルアドベントカレンダーの3日目の記事です。

h2oに対して、http2に対応した、速いサーバーという程度の認識しか持ち合わせていません。お金に困っています。

style="display:inline-block;width:300px;height:250px"

data-ad-client="ca-pub-6228424931662217"

data-ad-slot="7183996427">

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からlibh3o.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/h3o/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を読んで

libuvを思いっきり使ってるじゃん。

つまり、libuvのAPIもせっせとRustやGoでインポートしないといけない。

まぁ、GoだとRustよりは簡単に書けはするが、ちょっとハードル高いじゃないかと

次回につづく。。といいなぁ

まとめ

  • libhoge.aから.dylibが作れることが分かった
  • dylibファイルは動かすのには注意が必要
  • dylibファイルは作成時にどこに置くか決まっていないと後で面倒
  • dylib化出来たから、頑張ればnode.jsでもh2oを動かせるハズ
  • アプリケーションバンドル形式なアプリなら@executable_pathを指定するなど、相対的にパスの指定が可能
  • cgoだとlibhoge.aでも行ける模様

Link

関連記事