Mach-Oバイナリのライブラリロードパスをカスタマイズする方法
May 17, 2013 at 07:46 PM | categories: osx, unix, elf, mach-o |ライブラリの単体テストをするときとかに、実行プログラムがロードする共有ライブラリのパスを任意のディレクトリで上書きしたいときがある。
例えば以下のようなディレクトリ構成で、project/t/mytest
というバイナリをビルドするときにproject/src/libmy.so
をリンクするようにしておけば作業しやすい。
└── project ├── src │ ├── libmy.a │ ├── libmy.so -> libmy.so.1 │ ├── libmy.so.1 │ ├── Makefile │ ├── mylib.c │ ├── mylib.h │ └── mylib.o └── t ├── Makefile ├── mytest ├── mytest.c └── mytest.o
こういうときは、mytest
をビルドするときに以下のようにしてrpathを相対パスで追加していた。
$ cc -I../src -L../src -Wl,-rpath=../src *.c -lmy -o mytest $ readelf -d mytest Dynamic section at offset 0xe30 contains 22 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libmy.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000f (RPATH) Library rpath: [../src] 0x000000000000000c (INIT) 0x4004c8 0x000000000000000d (FINI) 0x4006f8 0x000000006ffffef5 (GNU_HASH) 0x400298 0x0000000000000005 (STRTAB) 0x4003c0 0x0000000000000006 (SYMTAB) 0x4002d0 0x000000000000000a (STRSZ) 134 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x600fe8 0x0000000000000002 (PLTRELSZ) 48 (bytes) 0x0000000000000014 (PLTREL) RELA 0x0000000000000017 (JMPREL) 0x400498 0x0000000000000007 (RELA) 0x400480 0x0000000000000008 (RELASZ) 24 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffe (VERNEED) 0x400460 0x000000006fffffff (VERNEEDNUM) 1 0x000000006ffffff0 (VERSYM) 0x400446 0x0000000000000000 (NULL) 0x0
しかし、OSXの場合は上記のように単に実行バイナリ側にrpathを追加しただけだと、ローダがrpathを設定するコマンドより先にライブラリをロードするコマンドを実行しようとして該当ファイルがみつけられなくて以下のようなエラーになってしまう.
dyld: Library not loaded: libmy.1.dylib Referenced from: /Users/path/to/project/t/./mytest Reason: image not found zsh: trace trap ./mytest
otool -l <executable file>
でロードコマンドの詳細をみると以下のようなエントリがみつかるが、ここのnameの値はライブラリ側のinstall_path
が設定される。
-- 中略 Load command 11 cmd LC_LOAD_DYLIB cmdsize 40 name libmy.1.dylib (offset 24) time stamp 2 Thu Jan 1 09:00:02 1970 current version 1.0.0 compatibility version 0.0.0
install_path
はsoname
のかわりのようなもので、なにも指定しなければ出力ファイル名になる。
ここに@executable_path
や@rpath
をつかうことによって、このダイナミックライブラリをリンクする側のバイナリに応じて挙動をかえることができる。
これらの変数(?)の詳細は参考リンクに解説がある。
要は、ELFのrpathとおなじような挙動にしたければ、 -Wl,-install_name,@rpath/libmy.1.dylib
というようなオプション付きでライブラリをビルドすればよい。
また、-Wl,-install_name,@executable_path/../src/libmy.1.dylib
のようにすると実行ファイルからの相対パスにすることができる。
この情報はリンクされる側のライブラリに埋めこまれている点に注意。
ELFに比べると柔軟にロードパスを制御することができると思われるが、うまく活用するのはちょっと難しそう。
参考リンク
About Me
mojavy |
Recent posts
95/5 Mbps とは
(August 30, 2015 at 04:22 PM)組み込み用プログラミング言語のパフォーマンス比較
(April 21, 2015 at 01:10 AM)最近読んだ本
(April 05, 2015 at 01:23 PM)Phabricatorを使ったワークフローについて
(March 02, 2015 at 08:55 PM)dnsimpleでダイナミックDNSをつかう
(December 23, 2014 at 08:02 PM)www2014のアドテク関連のResearch Trackメモ
(October 06, 2014 at 09:05 PM)flappymacs がMELPAに登録されました
(July 16, 2014 at 01:07 AM)EmacsでFlappy Birdっぽいもの書きました
(July 10, 2014 at 08:01 PM)
Recent Popular posts
Popular posts
Categories
- C (rss) (3)
- R (rss) (1)
- adtech (rss) (1)
- advent calendar (rss) (2)
- algorithms (rss) (2)
- android (rss) (2)
- aws (rss) (1)
- blog (rss) (2)
- blogofile (rss) (3)
- books (rss) (1)
- c++ (rss) (1)
- chef (rss) (4)
- common lisp (rss) (10)
- debian (rss) (2)
- dns (rss) (1)
- elasticsearch (rss) (1)
- elf (rss) (1)
- elisp (rss) (1)
- emacs (rss) (5)
- english (rss) (1)
- game (rss) (2)
- gearman (rss) (1)
- git (rss) (1)
- github (rss) (1)
- gitlab (rss) (1)
- golang (rss) (2)
- history (rss) (1)
- impress.js (rss) (1)
- internet (rss) (1)
- ios (rss) (3)
- jekyll (rss) (1)
- jenkins (rss) (1)
- linux (rss) (4)
- lisp (rss) (2)
- ltsv (rss) (1)
- lua (rss) (1)
- mac (rss) (3)
- mach-o (rss) (1)
- memo (rss) (2)
- mustache (rss) (1)
- note (rss) (1)
- objective-c (rss) (4)
- os (rss) (1)
- osx (rss) (2)
- others (rss) (1)
- paco (rss) (1)
- pdf (rss) (1)
- php (rss) (2)
- postfix (rss) (1)
- programming (rss) (12)
- project management (rss) (1)
- python (rss) (5)
- quicklinks (rss) (6)
- raspberry pi (rss) (2)
- redmine (rss) (1)
- reveal.js (rss) (1)
- ruby (rss) (10)
- sbcl (rss) (2)
- security (rss) (1)
- shell (rss) (2)
- smtp (rss) (1)
- solr (rss) (1)
- statistics (rss) (2)
- tips (rss) (10)
- tmux (rss) (3)
- toml (rss) (1)
- tools (rss) (1)
- twitter (rss) (1)
- ubuntu (rss) (1)
- unix (rss) (5)
- v8 (rss) (1)
- web (rss) (7)
- xcode (rss) (1)
- zeromq (rss) (2)
Archives
- August 2015 (1)
- April 2015 (2)
- March 2015 (1)
- December 2014 (1)
- October 2014 (1)
- July 2014 (3)
- March 2014 (6)
- February 2014 (4)
- November 2013 (3)
- October 2013 (4)
- September 2013 (2)
- July 2013 (2)
- June 2013 (2)
- May 2013 (1)
- April 2013 (6)
- March 2013 (3)
- February 2013 (8)
- January 2013 (5)
- December 2012 (1)
- November 2012 (6)
- October 2012 (7)
- August 2012 (1)
- July 2012 (9)
- June 2012 (1)
- April 2012 (1)
- December 2011 (2)
- November 2011 (2)