DynaLoader shouldn't use mod2fname when finding .bs files. blead
authorCraig A. Berry <craigberry@mac.com>
Sat, 13 Feb 2016 22:29:14 +0000 (16:29 -0600)
committerCraig A. Berry <craigberry@mac.com>
Sun, 14 Feb 2016 00:35:07 +0000 (18:35 -0600)
Some platforms (probably only VMS and Android at the moment) take
special steps via the function DynaLoader::mod2fname to construct
a dynamic library name that will be unique and (if too long)
truncated.  Then DynaLoader looks for a bootstrap file with the
exact same name as the dynamic library except with a .bs file
extension.

However, ExtUtils::MakeMaker has never produced bootstrap files
that have been run through mod2fname, so while a Foo:Bar extension
would produce a loadable library named PL__Foo_Bar.exe, the
bootstrap would be called Bar.bs. That shouldn't be a problem
since the bootstrap file is just Perl code read by Perl, but
DynaLoader has (apparently forever) been looking for
PL__Foo_Bar.bs and not finding it. So let's look for it by the
name under which it actually exists.

There are no core extensions that produce non-empty bootstrap
files and no existing test coverage, but as-yet-unintegrated
versions of MakeMaker do have such tests.  See, for example,

https://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker/commit/7f5e9a35addeea7ebfcded28277c85f723e1a5de

ext/DynaLoader/DynaLoader_pm.PL

index c2e860b..e828f35 100644 (file)
@@ -85,7 +85,7 @@ package DynaLoader;
 # Tim.Bunce@ig.co.uk, August 1994
 
 BEGIN {
-    $VERSION = '1.37';
+    $VERSION = '1.38';
 }
 
 EOT
@@ -319,6 +319,7 @@ sub bootstrap {
     <</$^O-eq-os2>>
     my @modparts = split(/::/,$module);
     my $modfname = $modparts[-1];
+    my $modfname_orig = $modfname; # For .bs file search
 
     # Some systems have restrictions on files names for DLL's etc.
     # mod2fname returns appropriate file base name (typically truncated)
@@ -338,9 +339,10 @@ sub bootstrap {
                       "(auto/$modpname/$modfname.$dl_dlext)\n"
        if $dl_debug;
 
+    my $dir;
     foreach (@INC) {
        <<$^O-eq-VMS>>chop($_ = VMS::Filespec::unixpath($_));<</$^O-eq-VMS>>
-           my $dir = "$_/auto/$modpname";
+           $dir = "$_/auto/$modpname";
        
        next unless -d $dir; # skip over uninteresting directories
        
@@ -365,7 +367,9 @@ sub bootstrap {
     # Execute optional '.bootstrap' perl script for this module.
     # The .bs file can be used to configure @dl_resolve_using etc to
     # match the needs of the individual module on this architecture.
-    my $bs = $file;
+    # N.B. The .bs file does not following the naming convention used
+    # by mod2fname.
+    my $bs = "$dir/$modfname_orig";
     $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
     if (-s $bs) { # only read file if it's not empty
         print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug;