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

けつあご日記

こんちは.菊地です.なんか浅ーいことをいろいろ書きます

Macでrpathを渡したり確認したり【なれない日記20160715】

なれない日記


↓経緯は過去記事参照.
www.ketsuago.com

teratailに投げていた質問に回答してもらい,Macでrpathを渡してコンパイルしたり確認したりする方法がわかった.
teratail.com

Macの実行可能バイナリはMach-O

gccでコンパイルしたバイナリはETF形式だと思っていたが,まずこれが間違い.Mach-Oという形式らしい.そのため,↑の過去記事でインストールしたbinutilsのgreadelfではなにも見れない.

otoolというツールが必要.これはXcodeをインストールしていれば勝手に入っているはず.

rpathを渡してコンパイルする方法

これは↑の過去記事でやっていたコマンドでOK.ただ↓がとてもわかり易かった(なぜ先日検索している時にこれが引っかからなかったのか不思議なぐらいだ...検索ワードのセンスが無いのか...).
qiita.com

こちらではcc,つまりclangでコンパイルしているが,コマンドが違うだけで結果としては同じになると思う.ちょっと改変して引用させてもらう.

$ cc -o test2 test2.c -L. -lfunc2 -Wl,-rpath,/tmp

これで「共有ライブラリlibfunc2.dylibをリンクして,test2.cをtest2という名前でコンパイル.ただし共有ライブラリを探すときは/tmpも見てね」というような意味になる.

rpathを見る

前述のotoolを使って,

$ otool -l test2

で見ることができる.

Load command 14
          cmd LC_RPATH
      cmdsize 24
         path /tmp (offset 12)

と書いてあるセクションがrpathを示している.今の場合ちゃんと/tmpが指定されていることがわかる.また,-Lオプションでどの共有ライブラリが使われているか確認できる.

$ otool -L test2
test2:
	@rpath/libfunc2.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

この@rpathが今は/tmpになっている.


ああちょっとすっきりした.よかった.ただ,Macではむしろrpathを使わないほうが簡単らしい...頭の片隅に置いとくぐらいにしておこう.こういう低レイヤーのノウハウはBinary Hackという本が詳しいらしい.ちょっと欲しいな...

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

  • 作者: 高林哲,鵜飼文敏,佐藤祐介,浜地慎一郎,首藤一幸
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/11/14
  • メディア: 単行本(ソフトカバー)
  • 購入: 23人 クリック: 383回
  • この商品を含むブログ (223件) を見る