PERL_DL_NONLAZY
とある環境で、PerlのTestを書いていて、make testを実行すると
install_driver(Oracle) failed: Can't load '/usr/lib/perl/site_perl/5.005/sun4-solaris/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: ld.so.1: /opt/local/bin/perl: 重大なエラー: 再配置エラー: ファイル /usr/lib/perl5/site_perl/5.005/sun4-solaris/auto/DBD/Oracle/Oracle.so: シンボル newSVuv: 参照シンボルが見つかりません。
というエラーに出くわすことがありました。これは、テスト実行時のPERL_DL_NONLAZY=1という環境変数設定を抜いてやるとうまくいったのですが、なぜテストの時はLAZYロードにするのかな?と疑問に思い調べてみると、
ExtUtils/MM_Unix.pm For some reason which I forget, Unix machines like to have PERL_DL_NONLAZY set for tests.
だそうです...
ExtUtils-MakeMakerの古いバージョン(その環境のものは5.4302)だと、ExtUtils/MM_Unix.pmに
$perl = "PERL_DL_NONLAZY=1 $perl" unless $Is_Win32;
とべた書きしてあって、LAZYロードに変えることはMakeMakerのオプションではできないようです。
なので、Makefile.PLで↓のようにして対処しています。
use ExtUtils::MakeMaker; use File::Copy; WriteMakefile( # ・・・ ); open(IN, "Makefile") || die; open(OUT,">Makefile.tmp") || die; while(<IN>) { s/PERL_DL_NONLAZY=1//g; print OUT; } close(OUT); close(IN); move("Makefile.tmp", "Makefile");
まあ、そもそもDBD/Oracle/Oracle.soのビルドの問題ではあるのですが...(多分、バイナリを他所から持ってきたのではと推測)