浅草橋クロニクル

2005-12-31

PERL_DL_NONLAZY

とある環境で、PerlTestを書いていて、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のビルドの問題ではあるのですが...(多分、バイナリを他所から持ってきたのではと推測)

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/asakusabashi/20051231/p1