VERSION Patch
[p5sagit/p5-mst-13.2.git] / ext / DynaLoader / DynaLoader.pm
CommitLineData
a0d0e21e 1package DynaLoader;
2
8e07c86e 3# And Gandalf said: 'Many folk like to know beforehand what is to
4# be set on the table; but those who have laboured to prepare the
5# feast like to keep their secret; for wonder makes the words of
6# praise louder.'
7
8# (Quote from Tolkien sugested by Anno Siegel.)
9#
10# See pod text at end of file for documentation.
11# See also ext/DynaLoader/README in source tree for other information.
12#
13# Tim.Bunce@ig.co.uk, August 1994
14
73c78b0a 15use vars qw($VERSION @ISA) ;
16
8e07c86e 17require Carp;
18require Config;
19require AutoLoader;
20
21@ISA=qw(AutoLoader);
22
73c78b0a 23$VERSION = "1.00" ;
8e07c86e 24
25sub import { } # override import inherited from AutoLoader
26
27# enable debug/trace messages from DynaLoader perl code
28$dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug;
29
30($dl_dlext, $dlsrc, $osname)
31 = @Config::Config{'dlext', 'dlsrc', 'osname'};
32
33# Some systems need special handling to expand file specifications
34# (VMS support by Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>)
35# See dl_expandspec() for more details. Should be harmless but
36# inefficient to define on systems that don't need it.
54d6a3b3 37$do_expand = $Is_VMS = $osname eq 'VMS';
8e07c86e 38
39@dl_require_symbols = (); # names of symbols we need
40@dl_resolve_using = (); # names of files to link with
41@dl_library_path = (); # path to look for files
42
43# This is a fix to support DLD's unfortunate desire to relink -lc
44@dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs";
45
46# Initialise @dl_library_path with the 'standard' library path
47# for this platform as determined by Configure
48push(@dl_library_path, split(' ',$Config::Config{'libpth'}));
49
50# Add to @dl_library_path any extra directories we can gather from
51# environment variables. So far LD_LIBRARY_PATH is the only known
52# variable used for this purpose. Others may be added later.
53push(@dl_library_path, split(/:/, $ENV{LD_LIBRARY_PATH}))
54 if $ENV{LD_LIBRARY_PATH};
55
56
57# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here.
54d6a3b3 58boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader);
8e07c86e 59
60
61if ($dl_debug) {
62 print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n";
63 print STDERR "DynaLoader not linked into this perl\n"
64 unless defined(&boot_DynaLoader);
65}
66
671; # End of main code
68
69
70# The bootstrap function cannot be autoloaded (without complications)
71# so we define it here:
72
73sub bootstrap {
74 # use local vars to enable $module.bs script to edit values
75 local(@args) = @_;
76 local($module) = $args[0];
77 local(@dirs, $file);
78
4633a7c4 79 Carp::confess("Usage: DynaLoader::bootstrap(module)") unless $module;
8e07c86e 80
81 # A common error on platforms which don't support dynamic loading.
82 # Since it's fatal and potentially confusing we give a detailed message.
83 Carp::croak("Can't load module $module, dynamic loading not available in this perl.\n".
84 " (You may need to build a new perl executable which either supports\n".
85 " dynamic loading or has the $module module statically linked into it.)\n")
86 unless defined(&dl_load_file);
87
88 my @modparts = split(/::/,$module);
89 my $modfname = $modparts[-1];
90
91 # Some systems have restrictions on files names for DLL's etc.
92 # mod2fname returns appropriate file base name (typically truncated)
93 # It may also edit @modparts if required.
94 $modfname = &mod2fname(\@modparts) if defined &mod2fname;
95
96 my $modpname = join('/',@modparts);
97
98 print STDERR "DynaLoader::bootstrap for $module ",
99 "(auto/$modpname/$modfname.$dl_dlext)\n" if $dl_debug;
100
101 foreach (@INC) {
54d6a3b3 102 chop($_ = VMS::Filespec::unixpath($_)) if $Is_VMS;
8e07c86e 103 my $dir = "$_/auto/$modpname";
104 next unless -d $dir; # skip over uninteresting directories
105
106 # check for common cases to avoid autoload of dl_findfile
107 last if ($file=_check_file("$dir/$modfname.$dl_dlext"));
108
109 # no luck here, save dir for possible later dl_findfile search
110 push(@dirs, "-L$dir");
111 }
112 # last resort, let dl_findfile have a go in all known locations
113 $file = dl_findfile(@dirs, map("-L$_",@INC), $modfname) unless $file;
114
4633a7c4 115 Carp::croak("Can't find loadable object for module $module in \@INC (@INC)")
8e07c86e 116 unless $file;
117
118 my $bootname = "boot_$module";
119 $bootname =~ s/\W/_/g;
120 @dl_require_symbols = ($bootname);
121
122 # Execute optional '.bootstrap' perl script for this module.
123 # The .bs file can be used to configure @dl_resolve_using etc to
124 # match the needs of the individual module on this architecture.
125 my $bs = $file;
126 $bs =~ s/(\.\w+)?$/\.bs/; # look for .bs 'beside' the library
127 if (-s $bs) { # only read file if it's not empty
128 print STDERR "BS: $bs ($osname, $dlsrc)\n" if $dl_debug;
129 eval { do $bs; };
130 warn "$bs: $@\n" if $@;
131 }
132
133 # Many dynamic extension loading problems will appear to come from
134 # this section of code: XYZ failed at line 123 of DynaLoader.pm.
135 # Often these errors are actually occurring in the initialisation
136 # C code of the extension XS file. Perl reports the error as being
137 # in this perl code simply because this was the last perl code
138 # it executed.
139
140 my $libref = dl_load_file($file) or
4633a7c4 141 Carp::croak("Can't load '$file' for module $module: ".dl_error()."\n");
8e07c86e 142
143 my @unresolved = dl_undef_symbols();
4633a7c4 144 Carp::carp("Undefined symbols present after loading $file: @unresolved\n")
8e07c86e 145 if @unresolved;
146
147 my $boot_symbol_ref = dl_find_symbol($libref, $bootname) or
4633a7c4 148 Carp::croak("Can't find '$bootname' symbol in $file\n");
8e07c86e 149
150 my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);
151
152 # See comment block above
153 &$xs(@args);
154}
155
156
157sub _check_file { # private utility to handle dl_expandspec vs -f tests
158 my($file) = @_;
159 return $file if (!$do_expand && -f $file); # the common case
160 return $file if ( $do_expand && ($file=dl_expandspec($file)));
161 return undef;
162}
163
164
165# Let autosplit and the autoloader deal with these functions:
166__END__
167
168
169sub dl_findfile {
170 # Read ext/DynaLoader/DynaLoader.doc for detailed information.
171 # This function does not automatically consider the architecture
172 # or the perl library auto directories.
173 my (@args) = @_;
174 my (@dirs, $dir); # which directories to search
175 my (@found); # full paths to real files we have found
8e07c86e 176 my $dl_so = $Config::Config{'so'}; # suffix for shared libraries
177
178 print STDERR "dl_findfile(@args)\n" if $dl_debug;
179
180 # accumulate directories but process files as they appear
181 arg: foreach(@args) {
182 # Special fast case: full filepath requires no search
54d6a3b3 183 if ($Is_VMS && m%[:>/\]]% && -f $_) {
184 push(@found,dl_expandspec(VMS::Filespec::vmsify($_)));
185 last arg unless wantarray;
186 next;
187 }
188 elsif (m:/: && -f $_ && !$do_expand) {
8e07c86e 189 push(@found,$_);
190 last arg unless wantarray;
191 next;
192 }
193
194 # Deal with directories first:
195 # Using a -L prefix is the preferred option (faster and more robust)
196 if (m:^-L:) { s/^-L//; push(@dirs, $_); next; }
197
198 # Otherwise we try to try to spot directories by a heuristic
199 # (this is a more complicated issue than it first appears)
200 if (m:/: && -d $_) { push(@dirs, $_); next; }
201
202 # VMS: we may be using native VMS directry syntax instead of
203 # Unix emulation, so check this as well
54d6a3b3 204 if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; }
8e07c86e 205
206 # Only files should get this far...
207 my(@names, $name); # what filenames to look for
208 if (m:-l: ) { # convert -lname to appropriate library name
209 s/-l//;
210 push(@names,"lib$_.$dl_so");
211 push(@names,"lib$_.a");
212 } else { # Umm, a bare name. Try various alternatives:
213 # these should be ordered with the most likely first
214 push(@names,"$_.$dl_so") unless m/\.$dl_so$/o;
215 push(@names,"lib$_.$dl_so") unless m:/:;
216 push(@names,"$_.o") unless m/\.(o|$dl_so)$/o;
217 push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs";
218 push(@names, $_);
219 }
220 foreach $dir (@dirs, @dl_library_path) {
221 next unless -d $dir;
54d6a3b3 222 chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS;
8e07c86e 223 foreach $name (@names) {
224 my($file) = "$dir/$name";
225 print STDERR " checking in $dir for $name\n" if $dl_debug;
226 $file = _check_file($file);
227 if ($file) {
228 push(@found, $file);
229 next arg; # no need to look any further
230 }
231 }
232 }
233 }
234 if ($dl_debug) {
235 foreach(@dirs) {
236 print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_;
237 }
238 print STDERR "dl_findfile found: @found\n";
239 }
240 return $found[0] unless wantarray;
241 @found;
242}
243
244
245sub dl_expandspec {
246 my($spec) = @_;
247 # Optional function invoked if DynaLoader.pm sets $do_expand.
248 # Most systems do not require or use this function.
249 # Some systems may implement it in the dl_*.xs file in which case
250 # this autoload version will not be called but is harmless.
251
252 # This function is designed to deal with systems which treat some
253 # 'filenames' in a special way. For example VMS 'Logical Names'
254 # (something like unix environment variables - but different).
255 # This function should recognise such names and expand them into
256 # full file paths.
257 # Must return undef if $spec is invalid or file does not exist.
258
259 my $file = $spec; # default output to input
260
261 if ($osname eq 'VMS') { # dl_expandspec should be defined in dl_vms.xs
4633a7c4 262 Carp::croak("dl_expandspec: should be defined in XS file!\n");
8e07c86e 263 } else {
264 return undef unless -f $file;
265 }
266 print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug;
267 $file;
268}
269
270
3b35bae3 271=head1 NAME
272
273DynaLoader - Dynamically load C libraries into Perl code
274
275dl_error(), dl_findfile(), dl_expandspec(), dl_load_file(), dl_find_symbol(), dl_undef_symbols(), dl_install_xsub(), boostrap() - routines used by DynaLoader modules
276
277=head1 SYNOPSIS
278
8e07c86e 279 package YourPackage;
3b35bae3 280 require DynaLoader;
c2960299 281 @ISA = qw(... DynaLoader ...);
8e07c86e 282 bootstrap YourPackage;
3b35bae3 283
284
285=head1 DESCRIPTION
286
c2960299 287This document defines a standard generic interface to the dynamic
3b35bae3 288linking mechanisms available on many platforms. Its primary purpose is
289to implement automatic dynamic loading of Perl modules.
290
c2960299 291This document serves as both a specification for anyone wishing to
292implement the DynaLoader for a new platform and as a guide for
293anyone wishing to use the DynaLoader directly in an application.
294
3b35bae3 295The DynaLoader is designed to be a very simple high-level
296interface that is sufficiently general to cover the requirements
297of SunOS, HP-UX, NeXT, Linux, VMS and other platforms.
298
c2960299 299It is also hoped that the interface will cover the needs of OS/2, NT
300etc and also allow pseudo-dynamic linking (using C<ld -A> at runtime).
3b35bae3 301
302It must be stressed that the DynaLoader, by itself, is practically
303useless for accessing non-Perl libraries because it provides almost no
304Perl-to-C 'glue'. There is, for example, no mechanism for calling a C
305library function or supplying arguments. It is anticipated that any
306glue that may be developed in the future will be implemented in a
307separate dynamically loaded module.
308
309DynaLoader Interface Summary
310
311 @dl_library_path
312 @dl_resolve_using
313 @dl_require_symbols
314 $dl_debug
315 Implemented in:
316 bootstrap($modulename) Perl
317 @filepaths = dl_findfile(@names) Perl
318
319 $libref = dl_load_file($filename) C
320 $symref = dl_find_symbol($libref, $symbol) C
321 @symbols = dl_undef_symbols() C
322 dl_install_xsub($name, $symref [, $filename]) C
323 $message = dl_error C
324
325=over 4
326
327=item @dl_library_path
328
329The standard/default list of directories in which dl_findfile() will
330search for libraries etc. Directories are searched in order:
331$dl_library_path[0], [1], ... etc
332
333@dl_library_path is initialised to hold the list of 'normal' directories
334(F</usr/lib>, etc) determined by B<Configure> (C<$Config{'libpth'}>). This should
335ensure portability across a wide range of platforms.
336
337@dl_library_path should also be initialised with any other directories
338that can be determined from the environment at runtime (such as
339LD_LIBRARY_PATH for SunOS).
340
341After initialisation @dl_library_path can be manipulated by an
342application using push and unshift before calling dl_findfile().
343Unshift can be used to add directories to the front of the search order
344either to save search time or to override libraries with the same name
345in the 'normal' directories.
346
347The load function that dl_load_file() calls may require an absolute
348pathname. The dl_findfile() function and @dl_library_path can be
349used to search for and return the absolute pathname for the
350library/object that you wish to load.
351
352=item @dl_resolve_using
353
354A list of additional libraries or other shared objects which can be
355used to resolve any undefined symbols that might be generated by a
356later call to load_file().
357
358This is only required on some platforms which do not handle dependent
359libraries automatically. For example the Socket Perl extension library
360(F<auto/Socket/Socket.so>) contains references to many socket functions
361which need to be resolved when it's loaded. Most platforms will
362automatically know where to find the 'dependent' library (e.g.,
363F</usr/lib/libsocket.so>). A few platforms need to to be told the location
364of the dependent library explicitly. Use @dl_resolve_using for this.
365
366Example usage:
367
368 @dl_resolve_using = dl_findfile('-lsocket');
369
370=item @dl_require_symbols
371
372A list of one or more symbol names that are in the library/object file
373to be dynamically loaded. This is only required on some platforms.
374
375=item dl_error()
376
377Syntax:
378
379 $message = dl_error();
380
381Error message text from the last failed DynaLoader function. Note
382that, similar to errno in unix, a successful function call does not
383reset this message.
384
385Implementations should detect the error as soon as it occurs in any of
386the other functions and save the corresponding message for later
387retrieval. This will avoid problems on some platforms (such as SunOS)
388where the error message is very temporary (e.g., dlerror()).
389
390=item $dl_debug
391
392Internal debugging messages are enabled when $dl_debug is set true.
393Currently setting $dl_debug only affects the Perl side of the
394DynaLoader. These messages should help an application developer to
395resolve any DynaLoader usage problems.
396
397$dl_debug is set to C<$ENV{'PERL_DL_DEBUG'}> if defined.
398
399For the DynaLoader developer/porter there is a similar debugging
400variable added to the C code (see dlutils.c) and enabled if Perl was
401built with the B<-DDEBUGGING> flag. This can also be set via the
402PERL_DL_DEBUG environment variable. Set to 1 for minimal information or
403higher for more.
404
405=item dl_findfile()
406
407Syntax:
408
409 @filepaths = dl_findfile(@names)
410
411Determine the full paths (including file suffix) of one or more
412loadable files given their generic names and optionally one or more
413directories. Searches directories in @dl_library_path by default and
414returns an empty list if no files were found.
415
416Names can be specified in a variety of platform independent forms. Any
417names in the form B<-lname> are converted into F<libname.*>, where F<.*> is
418an appropriate suffix for the platform.
419
420If a name does not already have a suitable prefix and/or suffix then
421the corresponding file will be searched for by trying combinations of
422prefix and suffix appropriate to the platform: "$name.o", "lib$name.*"
423and "$name".
424
425If any directories are included in @names they are searched before
c2960299 426@dl_library_path. Directories may be specified as B<-Ldir>. Any other
427names are treated as filenames to be searched for.
3b35bae3 428
429Using arguments of the form C<-Ldir> and C<-lname> is recommended.
430
431Example:
432
433 @dl_resolve_using = dl_findfile(qw(-L/usr/5lib -lposix));
434
435
436=item dl_expandspec()
437
438Syntax:
439
440 $filepath = dl_expandspec($spec)
441
442Some unusual systems, such as VMS, require special filename handling in
443order to deal with symbolic names for files (i.e., VMS's Logical Names).
444
445To support these systems a dl_expandspec() function can be implemented
446either in the F<dl_*.xs> file or code can be added to the autoloadable
c2960299 447dl_expandspec() function in F<DynaLoader.pm>. See F<DynaLoader.pm> for
448more information.
3b35bae3 449
450=item dl_load_file()
451
452Syntax:
453
454 $libref = dl_load_file($filename)
455
456Dynamically load $filename, which must be the path to a shared object
457or library. An opaque 'library reference' is returned as a handle for
458the loaded object. Returns undef on error.
459
460(On systems that provide a handle for the loaded object such as SunOS
461and HPUX, $libref will be that handle. On other systems $libref will
462typically be $filename or a pointer to a buffer containing $filename.
463The application should not examine or alter $libref in any way.)
464
465This is function that does the real work. It should use the current
466values of @dl_require_symbols and @dl_resolve_using if required.
467
468 SunOS: dlopen($filename)
469 HP-UX: shl_load($filename)
470 Linux: dld_create_reference(@dl_require_symbols); dld_link($filename)
471 NeXT: rld_load($filename, @dl_resolve_using)
472 VMS: lib$find_image_symbol($filename,$dl_require_symbols[0])
473
474
475=item dl_find_symbol()
476
477Syntax:
478
479 $symref = dl_find_symbol($libref, $symbol)
480
481Return the address of the symbol $symbol or C<undef> if not found. If the
482target system has separate functions to search for symbols of different
483types then dl_find_symbol() should search for function symbols first and
484then other types.
485
486The exact manner in which the address is returned in $symref is not
487currently defined. The only initial requirement is that $symref can
488be passed to, and understood by, dl_install_xsub().
489
490 SunOS: dlsym($libref, $symbol)
491 HP-UX: shl_findsym($libref, $symbol)
492 Linux: dld_get_func($symbol) and/or dld_get_symbol($symbol)
493 NeXT: rld_lookup("_$symbol")
494 VMS: lib$find_image_symbol($libref,$symbol)
495
496
497=item dl_undef_symbols()
498
499Example
500
501 @symbols = dl_undef_symbols()
502
503Return a list of symbol names which remain undefined after load_file().
504Returns C<()> if not known. Don't worry if your platform does not provide
c2960299 505a mechanism for this. Most do not need it and hence do not provide it,
506they just return an empty list.
3b35bae3 507
508
509=item dl_install_xsub()
510
511Syntax:
512
513 dl_install_xsub($perl_name, $symref [, $filename])
514
515Create a new Perl external subroutine named $perl_name using $symref as
516a pointer to the function which implements the routine. This is simply
517a direct call to newXSUB(). Returns a reference to the installed
518function.
519
520The $filename parameter is used by Perl to identify the source file for
521the function if required by die(), caller() or the debugger. If
522$filename is not defined then "DynaLoader" will be used.
523
524
525=item boostrap()
526
527Syntax:
528
529bootstrap($module)
530
531This is the normal entry point for automatic dynamic loading in Perl.
532
533It performs the following actions:
534
535=over 8
536
537=item *
538
539locates an auto/$module directory by searching @INC
540
541=item *
542
543uses dl_findfile() to determine the filename to load
544
545=item *
546
547sets @dl_require_symbols to C<("boot_$module")>
548
549=item *
550
551executes an F<auto/$module/$module.bs> file if it exists
552(typically used to add to @dl_resolve_using any files which
553are required to load the module on the current platform)
554
555=item *
556
557calls dl_load_file() to load the file
558
559=item *
560
561calls dl_undef_symbols() and warns if any symbols are undefined
562
563=item *
564
565calls dl_find_symbol() for "boot_$module"
566
567=item *
568
569calls dl_install_xsub() to install it as "${module}::bootstrap"
570
571=item *
572
8e07c86e 573calls &{"${module}::bootstrap"} to bootstrap the module (actually
574it uses the function reference returned by dl_install_xsub for speed)
3b35bae3 575
576=back
577
578=back
579
580
581=head1 AUTHOR
582
c2960299 583Tim Bunce, 11 August 1994.
584
3b35bae3 585This interface is based on the work and comments of (in no particular
586order): Larry Wall, Robert Sanders, Dean Roehrich, Jeff Okamoto, Anno
c2960299 587Siegel, Thomas Neumann, Paul Marquess, Charles Bailey, myself and others.
3b35bae3 588
589Larry Wall designed the elegant inherited bootstrap mechanism and
590implemented the first Perl 5 dynamic loader using it.
591
3b35bae3 592=cut