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