Hairy blib vs -I 5.6 note to myself

~/Perl/B-C-work
$ /usr/local/bin/perl5.6.2d-nt -Iblib/arch -Iblib/lib -MO=C 
    -e 'use Class::Accessor; print "ok"' | grep DynaLoader::dl_install_xsub
-e syntax OK

vs

~/Perl/B-C-work
$ /usr/local/bin/perl5.6.2d-nt -Mblib -MO=C -e 'use Class::Accessor; print "ok"' | grep DynaLoader::dl_install_xsub
Using /cygdrive/d/data/urbanr/My Documents/Perl/B-C-work/blib
    gv_list[42] = gv_fetchpv("DynaLoader::dl_install_xsub", TRUE, SVt_PV);
    GvCV(gv_list[42]) = (CV*)(newXS("DynaLoader::dl_install_xsub", XS_DynaLoader_dl_install_xsub, (char*)xsfile));
-e syntax OK

What does blib do to fix the old compiler? Note that cwd contains spaces in the path.

The compiler uses something like

$ /usr/local/bin/perl5.6.2d-nt -I"/cygdrive/d/data/urbanr/My Documents/Perl/B-C-work/blib/arch" 
  -I"/cygdrive/d/data/urbanr/My Documents/Perl/B-C-work/blib/lib" -MO=C 
  -e 'use Class::Accessor; print "ok"' | grep DynaLoader::dl_install_xsub

Explanation of the problem

With -I the compiler - only on 5.6 - misses to detect DynaLoader as it is needed to load XS functions, Sub::Name in this case. When parsing all op's and sv's the compiler sees a XSUB and may decide that it needs to bootstrap DynaLoader because it's a dynaloaded XS not a static one, so that it can boostrap the needed XSUB at run-time. Here it fails to detect this. DynaLoader::dlinstallxsub is one of the needed functions for the DynaLoader run-time. Bad things happen all the time, but here it is unexpected and it is very strange that it works if I use -Mblib instead.

Explanation of the root cause

Need to investigate it later

About Reini Urban

user-pic Working at cPanel on cperl, B::C (the perl-compiler), parrot, B::Generate, cygwin perl and more guts, keeping the system alive.