SSブログ

MailPeeper_menu.appのGmail対応 - OpneSSLライブラリをXcodeから使う5 [プログラミング]

アプリケーションバンドル内の、ダイナミックライブラリをロードするのに苦労したんだけど、結局は

 install_name_tool -id
 install_name_tool -change

という二つで解決しました。環境関数のせいでも、Xcodeの設定でもなくて、.dylibファイルの設定いかんだったという、何だか嫌な感じな、Macに独特な仕様のせいだったのでした。こっちは、そういうつぶしの効かない無駄な細かい設定は知りたくもないんですが…。

otoolって、MacOSの中のバイナリじゃなくても使えるのね。

$ otool -L libcrypto.1.0.0.dylib 
libcrypto.1.0.0.dylib:
	/opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

$ otool -L libssl.1.0.0.dylib 
libssl.1.0.0.dylib:
	/opt/local/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

$ otool -L libssl.1.2.5.dylib 
libz.1.2.5.dylib:
	/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)


libSystem.B.dylibは元から入ってそうなのでいいとして、libz.1.dylibってぇのは一緒に入れてあげないといけないらしい。それにしても、ここいらの設定(/opt/local/lib/)は、なぜずっと残っちゃうのか分からないんだよね。いい加減頭に来る。

 install_name_tool -change

で変えられるらしいんだけど、色々やっても一向に直る気配がしない。エラーが出て来れば分かるんだけど、パスを間違えてもエラーが出ないんだよね。こういうエラー処理をまともにしていないツールって自分だけが分かってて使うのならいいけど、一般に配布するに値しないかも。





お手本にFirefoxの中身を見ると下記のような感じ。

otool -L /Applications/network/Firefox.app/Contents/MacOS/libssl3.dylib 
/Applications/network/Firefox.app/Contents/MacOS/libssl3.dylib (architecture ppc):
	@executable_path/libssl3.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libnss3.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libnssutil3.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libplc4.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libplds4.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libnspr4.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.10)
/Applications/network/Firefox.app/Contents/MacOS/libssl3.dylib (architecture i386):
	@executable_path/libssl3.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libnss3.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libnssutil3.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libplc4.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libplds4.dylib (compatibility version 1.0.0, current version 1.0.0)
	@executable_path/libnspr4.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.10)


@executable_path/ってのが有効みたい。にしても、この状態のdylibに持っていけるもんかな?
ディレクトリを移動しても表示は変わらなかったので、どこにいても設定が有効になると思われ。そりゃどこに移動するか分からないパスを相対パスで扱わなくてどうするんだ、というのは常識的に分かる。でも、MacってWindowsとかLinuxの常識が通用しないところもあるからなぁ。


$ install_name_tool -add_rpath @exexute_path/ libz.1.2.5.dylib
install_name_tool: for: libz.1.2.5.dylib (for architecture x86_64) option "-add_rpath @exexute_path/" would duplicate path, file already has LC_RPATH for: @exexute_path/


やっとエラーが出た。すでに設定を持っているらしい。でもさ、上手くはいってないのよね。分からん。あ、-changeでも変えられるみたい。でもtypoでパス名を間違うと直せないっぽい。なんじゃ、このツールの仕様。

$ install_name_tool -change /opt/local/lib/libz.1.dylib @execute_path/libz.1.dylib libcrypto.1.0.0.dylib 
$ otool -L libcrypto.1.0.0.dylib libcrypto.1.0.0.dylib:
	/opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)


自分自身の設定が上書きされないみたい。しなくちゃいけないかどうかは分からないんだけど、やはり根本的に直すのは、ライブラリのビルド時に設定しないとダメなのかも。下は、libssl.1.0.0.dylibを改変して自分のパスを変えようとしたけど、それだけは変えられないんだよね。他のオプションでどうにかなるんかな?

$ install_name_tool -change /opt/local/lib/libz.1.dylib @execute_path/libz.1.dylib libssl.1.0.0.dylib 
$ install_name_tool -change /opt/local/lib/libcrypto.1.0.0.dylib @execute_path/libcrypto.1.0.0.dylib libssl.1.0.0.dylib 

$ install_name_tool -change /opt/local/lib/libssl.1.0.0.dylib @execute_path/libssl.1.0.0.dylib libssl.1.0.0.dylib

$ otool -L libssl.1.0.0.dylib
libssl.1.0.0.dylib:
	/opt/local/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@execute_path/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)






結局、英語を嫌々読んで分かったのが、-idオプションで自分のを設定パスを変えられるってことでした。ライブラリのある位置で次のようなコマンドを打つと、何とかotoolでの見た目は合わせる事ができた。これで大丈夫かな?

install_name_tool -id @execute_path/libz.1.dylib libz.1.2.5.dylib 
install_name_tool -id @execute_path/libcrypto.1.0.0.dylib libcrypto.1.0.0.dylib
install_name_tool -id @execute_path/libssl.1.0.0.dylib libssl.1.0.0.dylib

otool -L *.dylib
libcrypto.1.0.0.dylib:
	@execute_path/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
libssl.1.0.0.dylib:
	@execute_path/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@execute_path/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
	@execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
libz.1.2.5.dylib:
	@execute_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)


何とかイケそうな気がしてきたので、Xcodeに取り込んで使ってみる事にする。

うわ、いきなりダメだ。新しくこれまでの操作で手を入れたdylibを、Xcodeで使うように指定したんだけど、それまで散々プロジェクトの設定をいじくり倒したので、どうにも信頼ならない状態になっているらしい。それまでは、/opt/local/lib/にあるライブラリを見ていたので、変な設定でも無視されて弊害がなかったみたい。



最終的に効いたのは、プロジェクト設定で、動的ライブラリのインストール名ってところ。

 LD_DYLIB_INSTALL_NAME = @executable_path/

って感じでやりました。ダイナミックライブラリの設定は、MacOSのバイナリと同じところに設定したので、実行パスとライブラリのパスは同じです。気になるところは、そこぐらいかなぁ。一番の問題は、やっぱりdylibの設定です。install_name_tool -idと、install_name_tool -changeで変更しつつ、otool -Lで確認するといった体で。

インストール直後の環境に置いても、きちんと動作しているので、appバンドル内に含まれているOpenSSLのダイナミックライブラリを使ってくれているみたい。これで一安心。みんなに配布できる形にはできました。ソフト使うのに、MacPorts使ってライブラリ入れろとかあり得ないし。



プロジェクト設定のLD_RUNPATH_SEARCH_PATHSってのを設定してみたりしたけど、説明のところにWebで何度か見た-rpathの名前があった。でもLD_RUNPATH_SEARCH_PATHSでググっても参考になるようなページが見つからない。英語ページは"-rpath" xcodeで六万ぐらいヒットするのに、日本語だけに絞ると300件以下になっちゃう。何だろうね、この差は。良さげな予感がしたけど、結局、要りませんでした。



Murakami Takashi is a disgrace to the art world...


タグ:freesoft
nice!(1)  コメント(3) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 3

yuuri37

http://www.youtube.com/watch?v=mEQG-1j5ZUo&feature=related
Wishing you a blessed Christmas and joyful holidays.^^V
by yuuri37 (2010-12-25 09:59) 

miff

あ、ゆーりさんだ。ありがとうです。近々伺います〜。
by miff (2010-12-26 07:32) 

miff

あ、executable_pathがexecute_pathになってますね。executable_pathが正解。そのために、Xcode 4では外側のライブラリを見に行ってしまうハメになっていました。ヒドい目を見た。合掌。
by miff (2011-08-22 10:42) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。