2015/12/06

Homebrew で debug symbols を埋め込んだ LLVM の bottle を作る

Homebrew の bottle を使って debug information が埋め込まれた LLVM を配ってみんなで読もう、ということになったのでそのログ。


環境

  • OSX Yosemite 10.10.5
  • Homebrew 0.9.5
  • LLVM 3.8
  • あと自分のマシンじゃないのでチェックしてないけれど El Capitan (10.11.1?)


Release Build の LLVM の bottle 化

私が所属している研究室では Continuation Based C (CbC) という言語を開発していて、LLVM implemented 版があるのでまずはそいつで bottle で作れないかをチェック。
formula は github の ie-developers/ie/cbc にあります。

普通に build した LLVM を bottle にするのは結構簡単で、
  • brew install --build-bottle ie-developers/ie/cbc
  • brew bottle cbc
とか。 これで build された binary を固めたやつが current directory にできます。
ついでにこうやって書いてね、って出力が sha256 と共に出てくるのでそいつを formula に追記して、 bottle を公開用サーバか何かに置けばOK.


LLVM 3.8 の build を bottle 化

いつからか LLVM は build を repository の top でやると怒るようになってます。
具体的には ./configure をすると怒ってくる。
そいつを回避するために Homebrew 公式の llvm は mktemp を使っているようです。
なので mktemp を使ってやれば最近の LLVM も bottle 化することができます。


LLVM 3.8 を debug information 付きで build して bottle 化

ひとまず LLVM 3.8 を debug information 付きで build する手順としては

  • git clone http://llvm.org/git/llvm
  • mkdir llvm_build
  • cd llvm_build
  • ../llvm/configure --enable-debug-runtime --enable-debug-symbols --disable-optimized --enable-assertions
  • make -j 3
とか。
Debug+Assets って directory に bin と lib ができるのでそいつで追えます。
具体的には
  • lldb Debug+Assets/bin/clang
とかできます。


LLVM 3.8 を debug information 付きで build

Homebrew は build する時のディレクトリは build 時に生成して install 後に捨ててしまうっぽいです。
なので build 場所を変えてバイナリを残すように。
formula の prefix ってメソッドがインストール先のディレクトリを返してくれるので、その下で build しちゃいます。(ちなみに prefix の値は "/usr/local/Cellar/llvm_original/llvm3.8/" とか。)

インストール先のディレクトリで直接 build するれば、Debug+Assets が bottle に入るんじゃないかって魂胆。
あと、 Homebrew は make する時に CFLAGS とかを変更しちゃう superenv ってのがあるらしく、そいつは勝手に -g とかを落とすっぽいです。
なので build する時に --env=std とかすると良いらしい

ってなわけで
  • brew install --env=std --build-bottle ie-developers/ie/llvm_original
  • brew bottle
とかすると OK。
ちなみに圧縮前は8.9Gで圧縮後は2.1Gほど。
あと LLVM はとりあえず make するとこで止めてます。ファイル多くなっちゃいますし。


bottle を展開して lldb で追う

あとは落として追えば良いです。
が、 brew が build 時に buildpath を /private/tmp に作っちゃうのでそのパスを解決してやれば良い。

とか。

これで
  • lldb /usr/local/Cellar/llvm_original/llvm3.8/build/Debug+Asserts/bin/clang
  • l main
とかしてソースが表示されます。やったね。
ちなみにこの path は Yosemite の場合なので El Capitan の path はまた別です。
lldb が l main して時にファイルが無いって文句言うはずなのでそれを解決できように symlink 貼れば良いはず。


よもやまばなし

以下適当に本筋と関係無い話。

Cmake で build

Brew 公式の lldb は cmake で make してるっぽいです。
formula の中では std_cmake_args ってものを持ってるらしく、そいつが  -DCMAKE_BUILD_TYPES=Release を突っこむっぽいです。
なので CMAKE_BUILD_TYPES=Debug とか入れても弾かれる。
RelWithDebugInfo とかもあるのでそいつでもいけるかも?

superenv を見つけた話

どうも -g が有効じゃないっぽいのでログを漁ってたら
  • superenv removed:  -g -Wcast-qual -m64 -Wall -W -Wwrite-strings

とかあったので調べてみました。ログつよい。
ちなみにログの場所は
  • less ~/Library/Logs/Homebrew/llvm_original/02.make.cc
とかです。
superenv は -g を落として -O2 とかを入れてくれるっぽいので brew は Debug Build は基本入れない方針っぽいです。
もちろん --env=std で回避手段があるのは流石ですが。

Mach-O

ちなみに -g が効かないのを探すために Mach-O の仕様とか dSYM とか DWARF とか symbols コマンドとか dsymutil とか調べたりしてました。
その辺の hello.c とかコンパイルすると dSYM が作られて、そいつを消すと追えなかったのでこの辺が問題なのかなー、とか思ってゴニョゴニョしてました。
結果的にはハズレか。

make install してない

どうせ Debug+Assets が残ってないと追えないので make install はしてません。
なので brew link とかは効かないです。
make install した clang も Debug+Assets の debug symbols を見にいくはずなので、二重に clang 作るのは容量的に勿体ないかな、と。


参考文献とか

0 件のコメント:

コメントを投稿