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