CentOS 5.3 / x86_64 で Rabbit

64bit環境固有らしき「R_X86_64_32」問題。

/usr/bin/ld: rbatkhypertext.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
rbatkhypertext.o: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました

これです。

色々試したところ、コードに問題があるのではなく .o を生成する時のgccコンパイルオプション

$ make rbatkhypertext.o
gcc (中略)
 -I/usr/local/lib/ruby/site_ruby/1.8/x86_64-linux  -I  -fPIC -g -O2 -Wall -I/usr/local/include/atk-1.0
 -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include  -c rbatkhypertext.c

この -fPIC の前にある -I が悪さをしていました。

これ自体は glib/src/lib/mkmf-gnome2.rb で

$CPPFLAGS << " -I$(vendorarchdir) "

として付与されており、引数が空の -I を生成してしまっていました。空の -I の意味については深追いしていません。

ここをコメントアウトすればOKでした。

Changes によれば 2009-05-31 版から追加された模様です。<<追記>>
この関連は ruby-1.8.6-p368 と ruby-gtk2-0.19.1 で試しています。
メンテナの方に連絡したところ vendorarchdir が定義されている時だけ追加するように修正されるそうです。
また、vendorarchdir は古い目の Ruby で定義されていないとの事でしたので、Ruby 1.9 系では問題ないかもしれません。