| 1 | use Config;
|
|---|
| 2 |
|
|---|
| 3 | sub to_string {
|
|---|
| 4 | my ($value) = @_;
|
|---|
| 5 | $value =~ s/\\/\\\\/g;
|
|---|
| 6 | $value =~ s/'/\\'/g;
|
|---|
| 7 | return "'$value'";
|
|---|
| 8 | }
|
|---|
| 9 |
|
|---|
| 10 | unlink "DynaLoader.pm" if -f "DynaLoader.pm";
|
|---|
| 11 | open OUT, ">DynaLoader.pm" or die $!;
|
|---|
| 12 | print OUT <<'EOT';
|
|---|
| 13 |
|
|---|
| 14 | # Generated from DynaLoader.pm.PL
|
|---|
| 15 |
|
|---|
| 16 | package DynaLoader;
|
|---|
| 17 |
|
|---|
| 18 | # And Gandalf said: 'Many folk like to know beforehand what is to
|
|---|
| 19 | # be set on the table; but those who have laboured to prepare the
|
|---|
| 20 | # feast like to keep their secret; for wonder makes the words of
|
|---|
| 21 | # praise louder.'
|
|---|
| 22 |
|
|---|
| 23 | # (Quote from Tolkien suggested by Anno Siegel.)
|
|---|
| 24 | #
|
|---|
| 25 | # See pod text at end of file for documentation.
|
|---|
| 26 | # See also ext/DynaLoader/README in source tree for other information.
|
|---|
| 27 | #
|
|---|
| 28 | # [email protected], August 1994
|
|---|
| 29 |
|
|---|
| 30 | use vars qw($VERSION *AUTOLOAD);
|
|---|
| 31 |
|
|---|
| 32 | $VERSION = '1.05'; # avoid typo warning
|
|---|
| 33 |
|
|---|
| 34 | require AutoLoader;
|
|---|
| 35 | *AUTOLOAD = \&AutoLoader::AUTOLOAD;
|
|---|
| 36 |
|
|---|
| 37 | use Config;
|
|---|
| 38 |
|
|---|
| 39 | # The following require can't be removed during maintenance
|
|---|
| 40 | # releases, sadly, because of the risk of buggy code that does
|
|---|
| 41 | # require Carp; Carp::croak "..."; without brackets dying
|
|---|
| 42 | # if Carp hasn't been loaded in earlier compile time. :-(
|
|---|
| 43 | # We'll let those bugs get found on the development track.
|
|---|
| 44 | require Carp if $] < 5.00450;
|
|---|
| 45 |
|
|---|
| 46 | # enable debug/trace messages from DynaLoader perl code
|
|---|
| 47 | $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
|
|---|
| 48 |
|
|---|
| 49 | #
|
|---|
| 50 | # Flags to alter dl_load_file behaviour. Assigned bits:
|
|---|
| 51 | # 0x01 make symbols available for linking later dl_load_file's.
|
|---|
| 52 | # (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL))
|
|---|
| 53 | # (ignored under VMS; effect is built-in to image linking)
|
|---|
| 54 | #
|
|---|
| 55 | # This is called as a class method $module->dl_load_flags. The
|
|---|
| 56 | # definition here will be inherited and result on "default" loading
|
|---|
| 57 | # behaviour unless a sub-class of DynaLoader defines its own version.
|
|---|
| 58 | #
|
|---|
| 59 |
|
|---|
| 60 | sub dl_load_flags { 0x00 }
|
|---|
| 61 |
|
|---|
| 62 | # ($dl_dlext, $dlsrc)
|
|---|
| 63 | # = @Config::Config{'dlext', 'dlsrc'};
|
|---|
| 64 | EOT
|
|---|
| 65 |
|
|---|
| 66 | print OUT " (\$dl_dlext, \$dlsrc) = (",
|
|---|
| 67 | to_string($Config::Config{'dlext'}), ",",
|
|---|
| 68 | to_string($Config::Config{'dlsrc'}), ")\n;" ;
|
|---|
| 69 |
|
|---|
| 70 | print OUT <<'EOT';
|
|---|
| 71 |
|
|---|
| 72 | # Some systems need special handling to expand file specifications
|
|---|
| 73 | # (VMS support by Charles Bailey <[email protected]>)
|
|---|
| 74 | # See dl_expandspec() for more details. Should be harmless but
|
|---|
| 75 | # inefficient to define on systems that don't need it.
|
|---|
| 76 | $Is_VMS = $^O eq 'VMS';
|
|---|
| 77 | $do_expand = $Is_VMS;
|
|---|
| 78 | $Is_MacOS = $^O eq 'MacOS';
|
|---|
| 79 |
|
|---|
| 80 | my $Mac_FS;
|
|---|
| 81 | $Mac_FS = eval { require Mac::FileSpec::Unixish } if $Is_MacOS;
|
|---|
| 82 |
|
|---|
| 83 | @dl_require_symbols = (); # names of symbols we need
|
|---|
| 84 | @dl_resolve_using = (); # names of files to link with
|
|---|
| 85 | @dl_library_path = (); # path to look for files
|
|---|
| 86 |
|
|---|
| 87 | #XSLoader.pm may have added elements before we were required
|
|---|
| 88 | #@dl_shared_objects = (); # shared objects for symbols we have
|
|---|
| 89 | #@dl_librefs = (); # things we have loaded
|
|---|
| 90 | #@dl_modules = (); # Modules we have loaded
|
|---|
| 91 |
|
|---|
| 92 | # This is a fix to support DLD's unfortunate desire to relink -lc
|
|---|
| 93 | @dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs";
|
|---|
| 94 |
|
|---|
| 95 | EOT
|
|---|
| 96 |
|
|---|
| 97 | my $cfg_dl_library_path = <<'EOT';
|
|---|
| 98 | push(@dl_library_path, split(' ', $Config::Config{libpth}));
|
|---|
| 99 | EOT
|
|---|
| 100 |
|
|---|
| 101 | sub dquoted_comma_list {
|
|---|
| 102 | join(", ", map {qq("$_")} @_);
|
|---|
| 103 | }
|
|---|
| 104 |
|
|---|
| 105 | if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS}) {
|
|---|
| 106 | eval $cfg_dl_library_path;
|
|---|
| 107 | if (!$ENV{PERL_BUILD_EXPAND_ENV_VARS}) {
|
|---|
| 108 | my $dl_library_path = dquoted_comma_list(@dl_library_path);
|
|---|
| 109 | print OUT <<EOT;
|
|---|
| 110 | # The below \@dl_library_path has been expanded (%Config) in Perl build time.
|
|---|
| 111 |
|
|---|
| 112 | \@dl_library_path = ($dl_library_path);
|
|---|
| 113 |
|
|---|
| 114 | EOT
|
|---|
| 115 | }
|
|---|
| 116 | }
|
|---|
| 117 | else {
|
|---|
| 118 | print OUT <<EOT;
|
|---|
| 119 | # Initialise \@dl_library_path with the 'standard' library path
|
|---|
| 120 | # for this platform as determined by Configure.
|
|---|
| 121 |
|
|---|
| 122 | $cfg_dl_library_path
|
|---|
| 123 |
|
|---|
| 124 | EOT
|
|---|
| 125 | }
|
|---|
| 126 |
|
|---|
| 127 | my $ldlibpthname;
|
|---|
| 128 | my $ldlibpthname_defined;
|
|---|
| 129 | my $pthsep;
|
|---|
| 130 |
|
|---|
| 131 | if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS}) {
|
|---|
| 132 | $ldlibpthname = $Config::Config{ldlibpthname};
|
|---|
| 133 | $ldlibpthname_defined = defined $Config::Config{ldlibpthname} ? 1 : 0;
|
|---|
| 134 | $pthsep = $Config::Config{path_sep};
|
|---|
| 135 | }
|
|---|
| 136 | else {
|
|---|
| 137 | $ldlibpthname = q($Config::Config{ldlibpthname});
|
|---|
| 138 | $ldlibpthname_defined = q(defined $Config::Config{ldlibpthname});
|
|---|
| 139 | $pthsep = q($Config::Config{path_sep});
|
|---|
| 140 | print OUT <<EOT;
|
|---|
| 141 | my \$ldlibpthname = $ldlibpthname;
|
|---|
| 142 | my \$ldlibpthname_defined = $ldlibpthname_defined;
|
|---|
| 143 | my \$pthsep = $pthsep;
|
|---|
| 144 |
|
|---|
| 145 | EOT
|
|---|
| 146 | }
|
|---|
| 147 |
|
|---|
| 148 | my $env_dl_library_path = <<'EOT';
|
|---|
| 149 | if ($ldlibpthname_defined &&
|
|---|
| 150 | exists $ENV{$ldlibpthname}) {
|
|---|
| 151 | push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname}));
|
|---|
| 152 | }
|
|---|
| 153 |
|
|---|
| 154 | # E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH.
|
|---|
| 155 |
|
|---|
| 156 | if ($ldlibpthname_defined &&
|
|---|
| 157 | $ldlibpthname ne 'LD_LIBRARY_PATH' &&
|
|---|
| 158 | exists $ENV{LD_LIBRARY_PATH}) {
|
|---|
| 159 | push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH}));
|
|---|
| 160 | }
|
|---|
| 161 | EOT
|
|---|
| 162 |
|
|---|
| 163 | if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS} && $ENV{PERL_BUILD_EXPAND_ENV_VARS}) {
|
|---|
| 164 | eval $env_dl_library_path;
|
|---|
| 165 | }
|
|---|
| 166 | else {
|
|---|
| 167 | print OUT <<EOT;
|
|---|
| 168 | # Add to \@dl_library_path any extra directories we can gather from environment
|
|---|
| 169 | # during runtime.
|
|---|
| 170 |
|
|---|
| 171 | $env_dl_library_path
|
|---|
| 172 |
|
|---|
| 173 | EOT
|
|---|
| 174 | }
|
|---|
| 175 |
|
|---|
| 176 | if ($ENV{PERL_BUILD_EXPAND_CONFIG_VARS} && $ENV{PERL_BUILD_EXPAND_ENV_VARS}) {
|
|---|
| 177 | my $dl_library_path = dquoted_comma_list(@dl_library_path);
|
|---|
| 178 | print OUT <<EOT;
|
|---|
| 179 | # The below \@dl_library_path has been expanded (%Config, %ENV)
|
|---|
| 180 | # in Perl build time.
|
|---|
| 181 |
|
|---|
| 182 | \@dl_library_path = ($dl_library_path);
|
|---|
| 183 |
|
|---|
| 184 | EOT
|
|---|
| 185 | }
|
|---|
| 186 |
|
|---|
| 187 | print OUT <<'EOT';
|
|---|
| 188 | # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
|
|---|
| 189 | # NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB
|
|---|
| 190 | boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
|
|---|
| 191 | !defined(&dl_error);
|
|---|
| 192 |
|
|---|
| 193 | if ($dl_debug) {
|
|---|
| 194 | print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n";
|
|---|
| 195 | print STDERR "DynaLoader not linked into this perl\n"
|
|---|
| 196 | unless defined(&boot_DynaLoader);
|
|---|
| 197 | }
|
|---|
| 198 |
|
|---|
| 199 | 1; # End of main code
|
|---|
| 200 |
|
|---|
| 201 |
|
|---|
| 202 | sub croak { require Carp; Carp::croak(@_) }
|
|---|
| 203 |
|
|---|
| 204 | sub bootstrap_inherit {
|
|---|
| 205 | my $module = $_[0];
|
|---|
| 206 | local *isa = *{"$module\::ISA"};
|
|---|
| 207 | local @isa = (@isa, 'DynaLoader');
|
|---|
| 208 | # Cannot goto due to delocalization. Will report errors on a wrong line?
|
|---|
| 209 | bootstrap(@_);
|
|---|
| 210 | }
|
|---|
| 211 |
|
|---|
| 212 | # The bootstrap function cannot be autoloaded (without complications)
|
|---|
| 213 | # so we define it here:
|
|---|
| 214 |
|
|---|
| 215 | sub bootstrap {
|
|---|
| 216 | # use local vars to enable $module.bs script to edit values
|
|---|
| 217 | local(@args) = @_;
|
|---|
| 218 | local($module) = $args[0];
|
|---|
| 219 | local(@dirs, $file);
|
|---|
| 220 |
|
|---|
| 221 | unless ($module) {
|
|---|
| 222 | require Carp;
|
|---|
| 223 | Carp::confess("Usage: DynaLoader::bootstrap(module)");
|
|---|
| 224 | }
|
|---|
| 225 |
|
|---|
| 226 | # A common error on platforms which don't support dynamic loading.
|
|---|
| 227 | # Since it's fatal and potentially confusing we give a detailed message.
|
|---|
| 228 | croak("Can't load module $module, dynamic loading not available in this perl.\n".
|
|---|
| 229 | " (You may need to build a new perl executable which either supports\n".
|
|---|
| 230 | " dynamic loading or has the $module module statically linked into it.)\n")
|
|---|
| 231 | unless defined(&dl_load_file);
|
|---|
| 232 |
|
|---|
| 233 | EOT
|
|---|
| 234 |
|
|---|
| 235 | print OUT <<'EOT' if $^O eq 'os2';
|
|---|
| 236 | # Can dynaload, but cannot dynaload Perl modules...
|
|---|
| 237 | die 'Dynaloaded Perl modules are not available in this build of Perl' if $OS2::is_static;
|
|---|
| 238 |
|
|---|
| 239 | EOT
|
|---|
| 240 |
|
|---|
| 241 | print OUT <<'EOT';
|
|---|
| 242 | my @modparts = split(/::/,$module);
|
|---|
| 243 | my $modfname = $modparts[-1];
|
|---|
| 244 |
|
|---|
| 245 | # Some systems have restrictions on files names for DLL's etc.
|
|---|
| 246 | # mod2fname returns appropriate file base name (typically truncated)
|
|---|
| 247 | # It may also edit @modparts if required.
|
|---|
| 248 | $modfname = &mod2fname(\@modparts) if defined &mod2fname;
|
|---|
| 249 |
|
|---|
| 250 | # Truncate the module name to 8.3 format for NetWare
|
|---|
| 251 | if (($^O eq 'NetWare') && (length($modfname) > 8)) {
|
|---|
| 252 | $modfname = substr($modfname, 0, 8);
|
|---|
| 253 | }
|
|---|
| 254 |
|
|---|
| 255 | my $modpname = join(($Is_MacOS ? ':' : '/'),@modparts);
|
|---|
| 256 |
|
|---|
| 257 | print STDERR "DynaLoader::bootstrap for $module ",
|
|---|
| 258 | ($Is_MacOS
|
|---|
| 259 | ? "(:auto:$modpname:$modfname.$dl_dlext)\n" :
|
|---|
| 260 | "(auto/$modpname/$modfname.$dl_dlext)\n")
|
|---|
| 261 | if $dl_debug;
|
|---|
| 262 |
|
|---|
| 263 | foreach (@INC) {
|
|---|
| 264 | chop($_ = VMS::Filespec::unixpath($_)) if $Is_VMS;
|
|---|
| 265 | my $dir;
|
|---|
| 266 | if ($Is_MacOS) {
|
|---|
| 267 | my $path = $_;
|
|---|
| 268 | if ($Mac_FS && ! -d $path) {
|
|---|
| 269 | $path = Mac::FileSpec::Unixish::nativize($path);
|
|---|
| 270 | }
|
|---|
| 271 | $path .= ":" unless /:$/;
|
|---|
| 272 | $dir = "${path}auto:$modpname";
|
|---|
| 273 | } else {
|
|---|
| 274 | $dir = "$_/auto/$modpname";
|
|---|
| 275 | }
|
|---|
| 276 |
|
|---|
| 277 | next unless -d $dir; # skip over uninteresting directories
|
|---|
| 278 |
|
|---|
| 279 | # check for common cases to avoid autoload of dl_findfile
|
|---|
| 280 | my $try = $Is_MacOS ? "$dir:$modfname.$dl_dlext" : "$dir/$modfname.$dl_dlext";
|
|---|
| 281 | last if $file = ($do_expand) ? dl_expandspec($try) : ((-f $try) && $try);
|
|---|
| 282 |
|
|---|
| 283 | # no luck here, save dir for possible later dl_findfile search
|
|---|
| 284 | push @dirs, $dir;
|
|---|
| 285 | }
|
|---|
| 286 | # last resort, let dl_findfile have a go in all known locations
|
|---|
| 287 | $file = dl_findfile(map("-L$_",@dirs,@INC), $modfname) unless $file;
|
|---|
| 288 |
|
|---|
| 289 | croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)")
|
|---|
| 290 | unless $file; # wording similar to error from 'require'
|
|---|
| 291 |
|
|---|
| 292 | $file = uc($file) if $Is_VMS && $Config::Config{d_vms_case_sensitive_symbols};
|
|---|
| 293 | my $bootname = "boot_$module";
|
|---|
| 294 | $bootname =~ s/\W/_/g;
|
|---|
| 295 | @dl_require_symbols = ($bootname);
|
|---|
| 296 |
|
|---|
| 297 | # Execute optional '.bootstrap' perl script for this module.
|
|---|
| 298 | # The .bs file can be used to configure @dl_resolve_using etc to
|
|---|
| 299 | # match the needs of the individual module on this architecture.
|
|---|
| 300 | my $bs = $file;
|
|---|
| 301 | $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library
|
|---|
| 302 | if (-s $bs) { # only read file if it's not empty
|
|---|
| 303 | print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug;
|
|---|
| 304 | eval { do $bs; };
|
|---|
| 305 | warn "$bs: $@\n" if $@;
|
|---|
| 306 | }
|
|---|
| 307 |
|
|---|
| 308 | my $boot_symbol_ref;
|
|---|
| 309 |
|
|---|
| 310 | if ($^O eq 'darwin') {
|
|---|
| 311 | if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) {
|
|---|
| 312 | goto boot; #extension library has already been loaded, e.g. darwin
|
|---|
| 313 | }
|
|---|
| 314 | }
|
|---|
| 315 |
|
|---|
| 316 | # Many dynamic extension loading problems will appear to come from
|
|---|
| 317 | # this section of code: XYZ failed at line 123 of DynaLoader.pm.
|
|---|
| 318 | # Often these errors are actually occurring in the initialisation
|
|---|
| 319 | # C code of the extension XS file. Perl reports the error as being
|
|---|
| 320 | # in this perl code simply because this was the last perl code
|
|---|
| 321 | # it executed.
|
|---|
| 322 |
|
|---|
| 323 | my $libref = dl_load_file($file, $module->dl_load_flags) or
|
|---|
| 324 | croak("Can't load '$file' for module $module: ".dl_error());
|
|---|
| 325 |
|
|---|
| 326 | push(@dl_librefs,$libref); # record loaded object
|
|---|
| 327 |
|
|---|
| 328 | my @unresolved = dl_undef_symbols();
|
|---|
| 329 | if (@unresolved) {
|
|---|
| 330 | require Carp;
|
|---|
| 331 | Carp::carp("Undefined symbols present after loading $file: @unresolved\n");
|
|---|
| 332 | }
|
|---|
| 333 |
|
|---|
| 334 | $boot_symbol_ref = dl_find_symbol($libref, $bootname) or
|
|---|
| 335 | croak("Can't find '$bootname' symbol in $file\n");
|
|---|
| 336 |
|
|---|
| 337 | push(@dl_modules, $module); # record loaded module
|
|---|
| 338 |
|
|---|
| 339 | boot:
|
|---|
| 340 | my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
|
|---|
| 341 |
|
|---|
| 342 | # See comment block above
|
|---|
| 343 |
|
|---|
| 344 | push(@dl_shared_objects, $file); # record files loaded
|
|---|
| 345 |
|
|---|
| 346 | &$xs(@args);
|
|---|
| 347 | }
|
|---|
| 348 |
|
|---|
| 349 |
|
|---|
| 350 | #sub _check_file { # private utility to handle dl_expandspec vs -f tests
|
|---|
| 351 | # my($file) = @_;
|
|---|
| 352 | # return $file if (!$do_expand && -f $file); # the common case
|
|---|
| 353 | # return $file if ( $do_expand && ($file=dl_expandspec($file)));
|
|---|
| 354 | # return undef;
|
|---|
| 355 | #}
|
|---|
| 356 |
|
|---|
| 357 |
|
|---|
| 358 | # Let autosplit and the autoloader deal with these functions:
|
|---|
| 359 | __END__
|
|---|
| 360 |
|
|---|
| 361 |
|
|---|
| 362 | sub dl_findfile {
|
|---|
| 363 | # Read ext/DynaLoader/DynaLoader.doc for detailed information.
|
|---|
| 364 | # This function does not automatically consider the architecture
|
|---|
| 365 | # or the perl library auto directories.
|
|---|
| 366 | my (@args) = @_;
|
|---|
| 367 | my (@dirs, $dir); # which directories to search
|
|---|
| 368 | my (@found); # full paths to real files we have found
|
|---|
| 369 | EOT
|
|---|
| 370 |
|
|---|
| 371 | print OUT ' my $dl_ext= ' . to_string($Config::Config{'dlext'}) .
|
|---|
| 372 | "; # \$Config::Config{'dlext'} suffix for perl extensions\n";
|
|---|
| 373 | print OUT ' my $dl_so = ' . to_string($Config::Config{'so'}) .
|
|---|
| 374 | "; # \$Config::Config{'so'} suffix for shared libraries\n";
|
|---|
| 375 |
|
|---|
| 376 | print OUT <<'EOT';
|
|---|
| 377 |
|
|---|
| 378 | print STDERR "dl_findfile(@args)\n" if $dl_debug;
|
|---|
| 379 |
|
|---|
| 380 | # accumulate directories but process files as they appear
|
|---|
| 381 | arg: foreach(@args) {
|
|---|
| 382 | # Special fast case: full filepath requires no search
|
|---|
| 383 | if ($Is_VMS && m%[:>/\]]% && -f $_) {
|
|---|
| 384 | push(@found,dl_expandspec(VMS::Filespec::vmsify($_)));
|
|---|
| 385 | last arg unless wantarray;
|
|---|
| 386 | next;
|
|---|
| 387 | }
|
|---|
| 388 | elsif ($Is_MacOS) {
|
|---|
| 389 | if (m/:/ && -f $_) {
|
|---|
| 390 | push(@found,$_);
|
|---|
| 391 | last arg unless wantarray;
|
|---|
| 392 | }
|
|---|
| 393 | }
|
|---|
| 394 | elsif (m:/: && -f $_ && !$do_expand) {
|
|---|
| 395 | push(@found,$_);
|
|---|
| 396 | last arg unless wantarray;
|
|---|
| 397 | next;
|
|---|
| 398 | }
|
|---|
| 399 |
|
|---|
| 400 | # Deal with directories first:
|
|---|
| 401 | # Using a -L prefix is the preferred option (faster and more robust)
|
|---|
| 402 | if (m:^-L:) { s/^-L//; push(@dirs, $_); next; }
|
|---|
| 403 |
|
|---|
| 404 | if ($Is_MacOS) {
|
|---|
| 405 | # Otherwise we try to try to spot directories by a heuristic
|
|---|
| 406 | # (this is a more complicated issue than it first appears)
|
|---|
| 407 | if (m/:/ && -d $_) { push(@dirs, $_); next; }
|
|---|
| 408 | # Only files should get this far...
|
|---|
| 409 | my(@names, $name); # what filenames to look for
|
|---|
| 410 | s/^-l//;
|
|---|
| 411 | push(@names, $_);
|
|---|
| 412 | foreach $dir (@dirs, @dl_library_path) {
|
|---|
| 413 | next unless -d $dir;
|
|---|
| 414 | $dir =~ s/^([^:]+)$/:$1/;
|
|---|
| 415 | $dir =~ s/:$//;
|
|---|
| 416 | foreach $name (@names) {
|
|---|
| 417 | my($file) = "$dir:$name";
|
|---|
| 418 | print STDERR " checking in $dir for $name\n" if $dl_debug;
|
|---|
| 419 | if (-f $file) {
|
|---|
| 420 | push(@found, $file);
|
|---|
| 421 | next arg; # no need to look any further
|
|---|
| 422 | }
|
|---|
| 423 | }
|
|---|
| 424 | }
|
|---|
| 425 | next;
|
|---|
| 426 | }
|
|---|
| 427 |
|
|---|
| 428 | # Otherwise we try to try to spot directories by a heuristic
|
|---|
| 429 | # (this is a more complicated issue than it first appears)
|
|---|
| 430 | if (m:/: && -d $_) { push(@dirs, $_); next; }
|
|---|
| 431 |
|
|---|
| 432 | # VMS: we may be using native VMS directory syntax instead of
|
|---|
| 433 | # Unix emulation, so check this as well
|
|---|
| 434 | if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; }
|
|---|
| 435 |
|
|---|
| 436 | # Only files should get this far...
|
|---|
| 437 | my(@names, $name); # what filenames to look for
|
|---|
| 438 | if (m:-l: ) { # convert -lname to appropriate library name
|
|---|
| 439 | s/-l//;
|
|---|
| 440 | push(@names,"lib$_.$dl_so");
|
|---|
| 441 | push(@names,"lib$_.a");
|
|---|
| 442 | } else { # Umm, a bare name. Try various alternatives:
|
|---|
| 443 | # these should be ordered with the most likely first
|
|---|
| 444 | push(@names,"$_.$dl_ext") unless m/\.$dl_ext$/o;
|
|---|
| 445 | push(@names,"$_.$dl_so") unless m/\.$dl_so$/o;
|
|---|
| 446 | push(@names,"lib$_.$dl_so") unless m:/:;
|
|---|
| 447 | push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs";
|
|---|
| 448 | push(@names, $_);
|
|---|
| 449 | }
|
|---|
| 450 | foreach $dir (@dirs, @dl_library_path) {
|
|---|
| 451 | next unless -d $dir;
|
|---|
| 452 | chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS;
|
|---|
| 453 | foreach $name (@names) {
|
|---|
| 454 | my($file) = "$dir/$name";
|
|---|
| 455 | print STDERR " checking in $dir for $name\n" if $dl_debug;
|
|---|
| 456 | $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file);
|
|---|
| 457 | #$file = _check_file($file);
|
|---|
| 458 | if ($file) {
|
|---|
| 459 | push(@found, $file);
|
|---|
| 460 | next arg; # no need to look any further
|
|---|
| 461 | }
|
|---|
| 462 | }
|
|---|
| 463 | }
|
|---|
| 464 | }
|
|---|
| 465 | if ($dl_debug) {
|
|---|
| 466 | foreach(@dirs) {
|
|---|
| 467 | print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_;
|
|---|
| 468 | }
|
|---|
| 469 | print STDERR "dl_findfile found: @found\n";
|
|---|
| 470 | }
|
|---|
| 471 | return $found[0] unless wantarray;
|
|---|
| 472 | @found;
|
|---|
| 473 | }
|
|---|
| 474 |
|
|---|
| 475 |
|
|---|
| 476 | sub dl_expandspec {
|
|---|
| 477 | my($spec) = @_;
|
|---|
| 478 | # Optional function invoked if DynaLoader.pm sets $do_expand.
|
|---|
| 479 | # Most systems do not require or use this function.
|
|---|
| 480 | # Some systems may implement it in the dl_*.xs file in which case
|
|---|
| 481 | # this autoload version will not be called but is harmless.
|
|---|
| 482 |
|
|---|
| 483 | # This function is designed to deal with systems which treat some
|
|---|
| 484 | # 'filenames' in a special way. For example VMS 'Logical Names'
|
|---|
| 485 | # (something like unix environment variables - but different).
|
|---|
| 486 | # This function should recognise such names and expand them into
|
|---|
| 487 | # full file paths.
|
|---|
| 488 | # Must return undef if $spec is invalid or file does not exist.
|
|---|
| 489 |
|
|---|
| 490 | my $file = $spec; # default output to input
|
|---|
| 491 |
|
|---|
| 492 | if ($Is_VMS) { # dl_expandspec should be defined in dl_vms.xs
|
|---|
| 493 | require Carp;
|
|---|
| 494 | Carp::croak("dl_expandspec: should be defined in XS file!\n");
|
|---|
| 495 | } else {
|
|---|
| 496 | return undef unless -f $file;
|
|---|
| 497 | }
|
|---|
| 498 | print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug;
|
|---|
| 499 | $file;
|
|---|
| 500 | }
|
|---|
| 501 |
|
|---|
| 502 | sub dl_find_symbol_anywhere
|
|---|
| 503 | {
|
|---|
| 504 | my $sym = shift;
|
|---|
| 505 | my $libref;
|
|---|
| 506 | foreach $libref (@dl_librefs) {
|
|---|
| 507 | my $symref = dl_find_symbol($libref,$sym);
|
|---|
| 508 | return $symref if $symref;
|
|---|
| 509 | }
|
|---|
| 510 | return undef;
|
|---|
| 511 | }
|
|---|
| 512 |
|
|---|
| 513 | =head1 NAME
|
|---|
| 514 |
|
|---|
| 515 | DynaLoader - Dynamically load C libraries into Perl code
|
|---|
| 516 |
|
|---|
| 517 | =head1 SYNOPSIS
|
|---|
| 518 |
|
|---|
| 519 | package YourPackage;
|
|---|
| 520 | require DynaLoader;
|
|---|
| 521 | @ISA = qw(... DynaLoader ...);
|
|---|
| 522 | bootstrap YourPackage;
|
|---|
| 523 |
|
|---|
| 524 | # optional method for 'global' loading
|
|---|
| 525 | sub dl_load_flags { 0x01 }
|
|---|
| 526 |
|
|---|
| 527 |
|
|---|
| 528 | =head1 DESCRIPTION
|
|---|
| 529 |
|
|---|
| 530 | This document defines a standard generic interface to the dynamic
|
|---|
| 531 | linking mechanisms available on many platforms. Its primary purpose is
|
|---|
| 532 | to implement automatic dynamic loading of Perl modules.
|
|---|
| 533 |
|
|---|
| 534 | This document serves as both a specification for anyone wishing to
|
|---|
| 535 | implement the DynaLoader for a new platform and as a guide for
|
|---|
| 536 | anyone wishing to use the DynaLoader directly in an application.
|
|---|
| 537 |
|
|---|
| 538 | The DynaLoader is designed to be a very simple high-level
|
|---|
| 539 | interface that is sufficiently general to cover the requirements
|
|---|
| 540 | of SunOS, HP-UX, NeXT, Linux, VMS and other platforms.
|
|---|
| 541 |
|
|---|
| 542 | It is also hoped that the interface will cover the needs of OS/2, NT
|
|---|
| 543 | etc and also allow pseudo-dynamic linking (using C<ld -A> at runtime).
|
|---|
| 544 |
|
|---|
| 545 | It must be stressed that the DynaLoader, by itself, is practically
|
|---|
| 546 | useless for accessing non-Perl libraries because it provides almost no
|
|---|
| 547 | Perl-to-C 'glue'. There is, for example, no mechanism for calling a C
|
|---|
| 548 | library function or supplying arguments. A C::DynaLib module
|
|---|
| 549 | is available from CPAN sites which performs that function for some
|
|---|
| 550 | common system types. And since the year 2000, there's also Inline::C,
|
|---|
| 551 | a module that allows you to write Perl subroutines in C. Also available
|
|---|
| 552 | from your local CPAN site.
|
|---|
| 553 |
|
|---|
| 554 | DynaLoader Interface Summary
|
|---|
| 555 |
|
|---|
| 556 | @dl_library_path
|
|---|
| 557 | @dl_resolve_using
|
|---|
| 558 | @dl_require_symbols
|
|---|
| 559 | $dl_debug
|
|---|
| 560 | @dl_librefs
|
|---|
| 561 | @dl_modules
|
|---|
| 562 | @dl_shared_objects
|
|---|
| 563 | Implemented in:
|
|---|
| 564 | bootstrap($modulename) Perl
|
|---|
| 565 | @filepaths = dl_findfile(@names) Perl
|
|---|
| 566 | $flags = $modulename->dl_load_flags Perl
|
|---|
| 567 | $symref = dl_find_symbol_anywhere($symbol) Perl
|
|---|
| 568 |
|
|---|
| 569 | $libref = dl_load_file($filename, $flags) C
|
|---|
| 570 | $status = dl_unload_file($libref) C
|
|---|
| 571 | $symref = dl_find_symbol($libref, $symbol) C
|
|---|
| 572 | @symbols = dl_undef_symbols() C
|
|---|
| 573 | dl_install_xsub($name, $symref [, $filename]) C
|
|---|
| 574 | $message = dl_error C
|
|---|
| 575 |
|
|---|
| 576 | =over 4
|
|---|
| 577 |
|
|---|
| 578 | =item @dl_library_path
|
|---|
| 579 |
|
|---|
| 580 | The standard/default list of directories in which dl_findfile() will
|
|---|
| 581 | search for libraries etc. Directories are searched in order:
|
|---|
| 582 | $dl_library_path[0], [1], ... etc
|
|---|
| 583 |
|
|---|
| 584 | @dl_library_path is initialised to hold the list of 'normal' directories
|
|---|
| 585 | (F</usr/lib>, etc) determined by B<Configure> (C<$Config{'libpth'}>). This should
|
|---|
| 586 | ensure portability across a wide range of platforms.
|
|---|
| 587 |
|
|---|
| 588 | @dl_library_path should also be initialised with any other directories
|
|---|
| 589 | that can be determined from the environment at runtime (such as
|
|---|
| 590 | LD_LIBRARY_PATH for SunOS).
|
|---|
| 591 |
|
|---|
| 592 | After initialisation @dl_library_path can be manipulated by an
|
|---|
| 593 | application using push and unshift before calling dl_findfile().
|
|---|
| 594 | Unshift can be used to add directories to the front of the search order
|
|---|
| 595 | either to save search time or to override libraries with the same name
|
|---|
| 596 | in the 'normal' directories.
|
|---|
| 597 |
|
|---|
| 598 | The load function that dl_load_file() calls may require an absolute
|
|---|
| 599 | pathname. The dl_findfile() function and @dl_library_path can be
|
|---|
| 600 | used to search for and return the absolute pathname for the
|
|---|
| 601 | library/object that you wish to load.
|
|---|
| 602 |
|
|---|
| 603 | =item @dl_resolve_using
|
|---|
| 604 |
|
|---|
| 605 | A list of additional libraries or other shared objects which can be
|
|---|
| 606 | used to resolve any undefined symbols that might be generated by a
|
|---|
| 607 | later call to load_file().
|
|---|
| 608 |
|
|---|
| 609 | This is only required on some platforms which do not handle dependent
|
|---|
| 610 | libraries automatically. For example the Socket Perl extension
|
|---|
| 611 | library (F<auto/Socket/Socket.so>) contains references to many socket
|
|---|
| 612 | functions which need to be resolved when it's loaded. Most platforms
|
|---|
| 613 | will automatically know where to find the 'dependent' library (e.g.,
|
|---|
| 614 | F</usr/lib/libsocket.so>). A few platforms need to be told the
|
|---|
| 615 | location of the dependent library explicitly. Use @dl_resolve_using
|
|---|
| 616 | for this.
|
|---|
| 617 |
|
|---|
| 618 | Example usage:
|
|---|
| 619 |
|
|---|
| 620 | @dl_resolve_using = dl_findfile('-lsocket');
|
|---|
| 621 |
|
|---|
| 622 | =item @dl_require_symbols
|
|---|
| 623 |
|
|---|
| 624 | A list of one or more symbol names that are in the library/object file
|
|---|
| 625 | to be dynamically loaded. This is only required on some platforms.
|
|---|
| 626 |
|
|---|
| 627 | =item @dl_librefs
|
|---|
| 628 |
|
|---|
| 629 | An array of the handles returned by successful calls to dl_load_file(),
|
|---|
| 630 | made by bootstrap, in the order in which they were loaded.
|
|---|
| 631 | Can be used with dl_find_symbol() to look for a symbol in any of
|
|---|
| 632 | the loaded files.
|
|---|
| 633 |
|
|---|
| 634 | =item @dl_modules
|
|---|
| 635 |
|
|---|
| 636 | An array of module (package) names that have been bootstrap'ed.
|
|---|
| 637 |
|
|---|
| 638 | =item @dl_shared_objects
|
|---|
| 639 |
|
|---|
| 640 | An array of file names for the shared objects that were loaded.
|
|---|
| 641 |
|
|---|
| 642 | =item dl_error()
|
|---|
| 643 |
|
|---|
| 644 | Syntax:
|
|---|
| 645 |
|
|---|
| 646 | $message = dl_error();
|
|---|
| 647 |
|
|---|
| 648 | Error message text from the last failed DynaLoader function. Note
|
|---|
| 649 | that, similar to errno in unix, a successful function call does not
|
|---|
| 650 | reset this message.
|
|---|
| 651 |
|
|---|
| 652 | Implementations should detect the error as soon as it occurs in any of
|
|---|
| 653 | the other functions and save the corresponding message for later
|
|---|
| 654 | retrieval. This will avoid problems on some platforms (such as SunOS)
|
|---|
| 655 | where the error message is very temporary (e.g., dlerror()).
|
|---|
| 656 |
|
|---|
| 657 | =item $dl_debug
|
|---|
| 658 |
|
|---|
| 659 | Internal debugging messages are enabled when $dl_debug is set true.
|
|---|
| 660 | Currently setting $dl_debug only affects the Perl side of the
|
|---|
| 661 | DynaLoader. These messages should help an application developer to
|
|---|
| 662 | resolve any DynaLoader usage problems.
|
|---|
| 663 |
|
|---|
| 664 | $dl_debug is set to C<$ENV{'PERL_DL_DEBUG'}> if defined.
|
|---|
| 665 |
|
|---|
| 666 | For the DynaLoader developer/porter there is a similar debugging
|
|---|
| 667 | variable added to the C code (see dlutils.c) and enabled if Perl was
|
|---|
| 668 | built with the B<-DDEBUGGING> flag. This can also be set via the
|
|---|
| 669 | PERL_DL_DEBUG environment variable. Set to 1 for minimal information or
|
|---|
| 670 | higher for more.
|
|---|
| 671 |
|
|---|
| 672 | =item dl_findfile()
|
|---|
| 673 |
|
|---|
| 674 | Syntax:
|
|---|
| 675 |
|
|---|
| 676 | @filepaths = dl_findfile(@names)
|
|---|
| 677 |
|
|---|
| 678 | Determine the full paths (including file suffix) of one or more
|
|---|
| 679 | loadable files given their generic names and optionally one or more
|
|---|
| 680 | directories. Searches directories in @dl_library_path by default and
|
|---|
| 681 | returns an empty list if no files were found.
|
|---|
| 682 |
|
|---|
| 683 | Names can be specified in a variety of platform independent forms. Any
|
|---|
| 684 | names in the form B<-lname> are converted into F<libname.*>, where F<.*> is
|
|---|
| 685 | an appropriate suffix for the platform.
|
|---|
| 686 |
|
|---|
| 687 | If a name does not already have a suitable prefix and/or suffix then
|
|---|
| 688 | the corresponding file will be searched for by trying combinations of
|
|---|
| 689 | prefix and suffix appropriate to the platform: "$name.o", "lib$name.*"
|
|---|
| 690 | and "$name".
|
|---|
| 691 |
|
|---|
| 692 | If any directories are included in @names they are searched before
|
|---|
| 693 | @dl_library_path. Directories may be specified as B<-Ldir>. Any other
|
|---|
| 694 | names are treated as filenames to be searched for.
|
|---|
| 695 |
|
|---|
| 696 | Using arguments of the form C<-Ldir> and C<-lname> is recommended.
|
|---|
| 697 |
|
|---|
| 698 | Example:
|
|---|
| 699 |
|
|---|
| 700 | @dl_resolve_using = dl_findfile(qw(-L/usr/5lib -lposix));
|
|---|
| 701 |
|
|---|
| 702 |
|
|---|
| 703 | =item dl_expandspec()
|
|---|
| 704 |
|
|---|
| 705 | Syntax:
|
|---|
| 706 |
|
|---|
| 707 | $filepath = dl_expandspec($spec)
|
|---|
| 708 |
|
|---|
| 709 | Some unusual systems, such as VMS, require special filename handling in
|
|---|
| 710 | order to deal with symbolic names for files (i.e., VMS's Logical Names).
|
|---|
| 711 |
|
|---|
| 712 | To support these systems a dl_expandspec() function can be implemented
|
|---|
| 713 | either in the F<dl_*.xs> file or code can be added to the autoloadable
|
|---|
| 714 | dl_expandspec() function in F<DynaLoader.pm>. See F<DynaLoader.pm> for
|
|---|
| 715 | more information.
|
|---|
| 716 |
|
|---|
| 717 | =item dl_load_file()
|
|---|
| 718 |
|
|---|
| 719 | Syntax:
|
|---|
| 720 |
|
|---|
| 721 | $libref = dl_load_file($filename, $flags)
|
|---|
| 722 |
|
|---|
| 723 | Dynamically load $filename, which must be the path to a shared object
|
|---|
| 724 | or library. An opaque 'library reference' is returned as a handle for
|
|---|
| 725 | the loaded object. Returns undef on error.
|
|---|
| 726 |
|
|---|
| 727 | The $flags argument to alters dl_load_file behaviour.
|
|---|
| 728 | Assigned bits:
|
|---|
| 729 |
|
|---|
| 730 | 0x01 make symbols available for linking later dl_load_file's.
|
|---|
| 731 | (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL))
|
|---|
| 732 | (ignored under VMS; this is a normal part of image linking)
|
|---|
| 733 |
|
|---|
| 734 | (On systems that provide a handle for the loaded object such as SunOS
|
|---|
| 735 | and HPUX, $libref will be that handle. On other systems $libref will
|
|---|
| 736 | typically be $filename or a pointer to a buffer containing $filename.
|
|---|
| 737 | The application should not examine or alter $libref in any way.)
|
|---|
| 738 |
|
|---|
| 739 | This is the function that does the real work. It should use the
|
|---|
| 740 | current values of @dl_require_symbols and @dl_resolve_using if required.
|
|---|
| 741 |
|
|---|
| 742 | SunOS: dlopen($filename)
|
|---|
| 743 | HP-UX: shl_load($filename)
|
|---|
| 744 | Linux: dld_create_reference(@dl_require_symbols); dld_link($filename)
|
|---|
| 745 | NeXT: rld_load($filename, @dl_resolve_using)
|
|---|
| 746 | VMS: lib$find_image_symbol($filename,$dl_require_symbols[0])
|
|---|
| 747 |
|
|---|
| 748 | (The dlopen() function is also used by Solaris and some versions of
|
|---|
| 749 | Linux, and is a common choice when providing a "wrapper" on other
|
|---|
| 750 | mechanisms as is done in the OS/2 port.)
|
|---|
| 751 |
|
|---|
| 752 | =item dl_unload_file()
|
|---|
| 753 |
|
|---|
| 754 | Syntax:
|
|---|
| 755 |
|
|---|
| 756 | $status = dl_unload_file($libref)
|
|---|
| 757 |
|
|---|
| 758 | Dynamically unload $libref, which must be an opaque 'library reference' as
|
|---|
| 759 | returned from dl_load_file. Returns one on success and zero on failure.
|
|---|
| 760 |
|
|---|
| 761 | This function is optional and may not necessarily be provided on all platforms.
|
|---|
| 762 | If it is defined, it is called automatically when the interpreter exits for
|
|---|
| 763 | every shared object or library loaded by DynaLoader::bootstrap. All such
|
|---|
| 764 | library references are stored in @dl_librefs by DynaLoader::Bootstrap as it
|
|---|
| 765 | loads the libraries. The files are unloaded in last-in, first-out order.
|
|---|
| 766 |
|
|---|
| 767 | This unloading is usually necessary when embedding a shared-object perl (e.g.
|
|---|
| 768 | one configured with -Duseshrplib) within a larger application, and the perl
|
|---|
| 769 | interpreter is created and destroyed several times within the lifetime of the
|
|---|
| 770 | application. In this case it is possible that the system dynamic linker will
|
|---|
| 771 | unload and then subsequently reload the shared libperl without relocating any
|
|---|
| 772 | references to it from any files DynaLoaded by the previous incarnation of the
|
|---|
| 773 | interpreter. As a result, any shared objects opened by DynaLoader may point to
|
|---|
| 774 | a now invalid 'ghost' of the libperl shared object, causing apparently random
|
|---|
| 775 | memory corruption and crashes. This behaviour is most commonly seen when using
|
|---|
| 776 | Apache and mod_perl built with the APXS mechanism.
|
|---|
| 777 |
|
|---|
| 778 | SunOS: dlclose($libref)
|
|---|
| 779 | HP-UX: ???
|
|---|
| 780 | Linux: ???
|
|---|
| 781 | NeXT: ???
|
|---|
| 782 | VMS: ???
|
|---|
| 783 |
|
|---|
| 784 | (The dlclose() function is also used by Solaris and some versions of
|
|---|
| 785 | Linux, and is a common choice when providing a "wrapper" on other
|
|---|
| 786 | mechanisms as is done in the OS/2 port.)
|
|---|
| 787 |
|
|---|
| 788 | =item dl_load_flags()
|
|---|
| 789 |
|
|---|
| 790 | Syntax:
|
|---|
| 791 |
|
|---|
| 792 | $flags = dl_load_flags $modulename;
|
|---|
| 793 |
|
|---|
| 794 | Designed to be a method call, and to be overridden by a derived class
|
|---|
| 795 | (i.e. a class which has DynaLoader in its @ISA). The definition in
|
|---|
| 796 | DynaLoader itself returns 0, which produces standard behavior from
|
|---|
| 797 | dl_load_file().
|
|---|
| 798 |
|
|---|
| 799 | =item dl_find_symbol()
|
|---|
| 800 |
|
|---|
| 801 | Syntax:
|
|---|
| 802 |
|
|---|
| 803 | $symref = dl_find_symbol($libref, $symbol)
|
|---|
| 804 |
|
|---|
| 805 | Return the address of the symbol $symbol or C<undef> if not found. If the
|
|---|
| 806 | target system has separate functions to search for symbols of different
|
|---|
| 807 | types then dl_find_symbol() should search for function symbols first and
|
|---|
| 808 | then other types.
|
|---|
| 809 |
|
|---|
| 810 | The exact manner in which the address is returned in $symref is not
|
|---|
| 811 | currently defined. The only initial requirement is that $symref can
|
|---|
| 812 | be passed to, and understood by, dl_install_xsub().
|
|---|
| 813 |
|
|---|
| 814 | SunOS: dlsym($libref, $symbol)
|
|---|
| 815 | HP-UX: shl_findsym($libref, $symbol)
|
|---|
| 816 | Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol)
|
|---|
| 817 | NeXT: rld_lookup("_$symbol")
|
|---|
| 818 | VMS: lib$find_image_symbol($libref,$symbol)
|
|---|
| 819 |
|
|---|
| 820 |
|
|---|
| 821 | =item dl_find_symbol_anywhere()
|
|---|
| 822 |
|
|---|
| 823 | Syntax:
|
|---|
| 824 |
|
|---|
| 825 | $symref = dl_find_symbol_anywhere($symbol)
|
|---|
| 826 |
|
|---|
| 827 | Applies dl_find_symbol() to the members of @dl_librefs and returns
|
|---|
| 828 | the first match found.
|
|---|
| 829 |
|
|---|
| 830 | =item dl_undef_symbols()
|
|---|
| 831 |
|
|---|
| 832 | Example
|
|---|
| 833 |
|
|---|
| 834 | @symbols = dl_undef_symbols()
|
|---|
| 835 |
|
|---|
| 836 | Return a list of symbol names which remain undefined after load_file().
|
|---|
| 837 | Returns C<()> if not known. Don't worry if your platform does not provide
|
|---|
| 838 | a mechanism for this. Most do not need it and hence do not provide it,
|
|---|
| 839 | they just return an empty list.
|
|---|
| 840 |
|
|---|
| 841 |
|
|---|
| 842 | =item dl_install_xsub()
|
|---|
| 843 |
|
|---|
| 844 | Syntax:
|
|---|
| 845 |
|
|---|
| 846 | dl_install_xsub($perl_name, $symref [, $filename])
|
|---|
| 847 |
|
|---|
| 848 | Create a new Perl external subroutine named $perl_name using $symref as
|
|---|
| 849 | a pointer to the function which implements the routine. This is simply
|
|---|
| 850 | a direct call to newXSUB(). Returns a reference to the installed
|
|---|
| 851 | function.
|
|---|
| 852 |
|
|---|
| 853 | The $filename parameter is used by Perl to identify the source file for
|
|---|
| 854 | the function if required by die(), caller() or the debugger. If
|
|---|
| 855 | $filename is not defined then "DynaLoader" will be used.
|
|---|
| 856 |
|
|---|
| 857 |
|
|---|
| 858 | =item bootstrap()
|
|---|
| 859 |
|
|---|
| 860 | Syntax:
|
|---|
| 861 |
|
|---|
| 862 | bootstrap($module)
|
|---|
| 863 |
|
|---|
| 864 | This is the normal entry point for automatic dynamic loading in Perl.
|
|---|
| 865 |
|
|---|
| 866 | It performs the following actions:
|
|---|
| 867 |
|
|---|
| 868 | =over 8
|
|---|
| 869 |
|
|---|
| 870 | =item *
|
|---|
| 871 |
|
|---|
| 872 | locates an auto/$module directory by searching @INC
|
|---|
| 873 |
|
|---|
| 874 | =item *
|
|---|
| 875 |
|
|---|
| 876 | uses dl_findfile() to determine the filename to load
|
|---|
| 877 |
|
|---|
| 878 | =item *
|
|---|
| 879 |
|
|---|
| 880 | sets @dl_require_symbols to C<("boot_$module")>
|
|---|
| 881 |
|
|---|
| 882 | =item *
|
|---|
| 883 |
|
|---|
| 884 | executes an F<auto/$module/$module.bs> file if it exists
|
|---|
| 885 | (typically used to add to @dl_resolve_using any files which
|
|---|
| 886 | are required to load the module on the current platform)
|
|---|
| 887 |
|
|---|
| 888 | =item *
|
|---|
| 889 |
|
|---|
| 890 | calls dl_load_flags() to determine how to load the file.
|
|---|
| 891 |
|
|---|
| 892 | =item *
|
|---|
| 893 |
|
|---|
| 894 | calls dl_load_file() to load the file
|
|---|
| 895 |
|
|---|
| 896 | =item *
|
|---|
| 897 |
|
|---|
| 898 | calls dl_undef_symbols() and warns if any symbols are undefined
|
|---|
| 899 |
|
|---|
| 900 | =item *
|
|---|
| 901 |
|
|---|
| 902 | calls dl_find_symbol() for "boot_$module"
|
|---|
| 903 |
|
|---|
| 904 | =item *
|
|---|
| 905 |
|
|---|
| 906 | calls dl_install_xsub() to install it as "${module}::bootstrap"
|
|---|
| 907 |
|
|---|
| 908 | =item *
|
|---|
| 909 |
|
|---|
| 910 | calls &{"${module}::bootstrap"} to bootstrap the module (actually
|
|---|
| 911 | it uses the function reference returned by dl_install_xsub for speed)
|
|---|
| 912 |
|
|---|
| 913 | =back
|
|---|
| 914 |
|
|---|
| 915 | =back
|
|---|
| 916 |
|
|---|
| 917 |
|
|---|
| 918 | =head1 AUTHOR
|
|---|
| 919 |
|
|---|
| 920 | Tim Bunce, 11 August 1994.
|
|---|
| 921 |
|
|---|
| 922 | This interface is based on the work and comments of (in no particular
|
|---|
| 923 | order): Larry Wall, Robert Sanders, Dean Roehrich, Jeff Okamoto, Anno
|
|---|
| 924 | Siegel, Thomas Neumann, Paul Marquess, Charles Bailey, myself and others.
|
|---|
| 925 |
|
|---|
| 926 | Larry Wall designed the elegant inherited bootstrap mechanism and
|
|---|
| 927 | implemented the first Perl 5 dynamic loader using it.
|
|---|
| 928 |
|
|---|
| 929 | Solaris global loading added by Nick Ing-Simmons with design/coding
|
|---|
| 930 | assistance from Tim Bunce, January 1996.
|
|---|
| 931 |
|
|---|
| 932 | =cut
|
|---|
| 933 | EOT
|
|---|
| 934 |
|
|---|
| 935 | close OUT or die $!;
|
|---|
| 936 |
|
|---|