2011-08-09 (Tue) [長年日記]
_ コンパイル時の出力を冗長モードにする方法
最近のRubyのコンパイルは静かだ。
$ make ... compiling ../complex.c compiling ../dir.c ...
しかし、何をやっているか見たい時もある。そういう場合は、make時にV=1を付けるとよい。
$ make V=1 ... gcc -g -O0 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=implicit-function-declaration -fPIC -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT -I. -I.ext/include/i686-linux -I../include -I.. -o load.o -c ../load.c gcc -g -O0 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=implicit-function-declaration -fPIC -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT -I. -I.ext/include/i686-linux -I../include -I.. -o proc.o -c ../proc.c ...
_ -fvisibility=hidden
ひさびさにmod_rubyをビルドしてみたら、以下のようなメッセージが出てApacheが起動しない。
/usr/lib/apache2/modules/mod_ruby.so: undefined symbol: ruby_dln_librefs
Rubyのソースを見てもruby_dln_librefsが消されたわけではないので、ちょっとハマってしまった。
gccには-fvisibility=hiddenというオプションがあって、そのライブラリの中ではグローバルに参照されるシンボルでも、リンクされる他のライブラリや実行ファイルからは隠すことができるのだが、Rubyでもいつの間にかそれが使われるようになったらしい。
commit d72ab5a671ca9bdb3fa75431ab4aaebf1620f0fa Author: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> Date: Wed Jul 21 21:38:25 2010 +0000 * configure.in (XCFLAGS): use -fvisibility=hidden if possible. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28709 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
上記のcommitからのようだけど、何か議論とかあったっけ?
mod_rubyではRubyのシンボルを色々勝手に参照していて、だいたいはrb_funcall()やrb_gv_get()とかで回避したけど、Init_prelude()が呼べないのはどうにもならなさそうなのでチケットを挙げておいた。
ruby_dln_librefsの方は拡張ライブラリをアンロードするために使っていたようだけど、そもそも何のためにしていたのか思い出せないので、とりあえず1.9の時は当該処理をしないようにしておいた。