non vorrei lavorare

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

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

はじめに

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

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

 

libh2oの記事を読んで学んだこと

記事見てGoで動かせそうと思った

libh2o をビルドする - Qiita

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を読んで

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

関連記事

 

5年前の記事

1年前の記事

1年後の記事

2年後の記事

3年後の記事