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