diff options
author | Doug MacEachern <dougm@covalent.net> | 2002-05-30 20:05:47 +0000 |
---|---|---|
committer | Doug MacEachern <dougm@covalent.net> | 2002-05-30 20:05:47 +0000 |
commit | 588cafc81b146d309df37bae231b533d51bccb74 (patch) | |
tree | 43935ddded44416750d0942cb751cba18840f9aa /ext | |
parent | d4dccd5f0004873a20dd5dc039f9e61e7ef68bbb (diff) | |
download | perl-588cafc81b146d309df37bae231b533d51bccb74.tar.gz |
prevent attempts to load extension libraries more than once on darwin.
avoiding fatal errors in the form of: "multiple definitions of symbol _XS_foo"
p4raw-id: //depot/perl@16903
Diffstat (limited to 'ext')
-rw-r--r-- | ext/DynaLoader/DynaLoader_pm.PL | 15 | ||||
-rw-r--r-- | ext/DynaLoader/XSLoader_pm.PL | 15 |
2 files changed, 24 insertions, 6 deletions
diff --git a/ext/DynaLoader/DynaLoader_pm.PL b/ext/DynaLoader/DynaLoader_pm.PL index 9fdaf70be8..d6e6dc6b65 100644 --- a/ext/DynaLoader/DynaLoader_pm.PL +++ b/ext/DynaLoader/DynaLoader_pm.PL @@ -283,6 +283,14 @@ sub bootstrap { warn "$bs: $@\n" if $@; } + my $boot_symbol_ref; + + if ($^O eq 'darwin') { + if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { + goto boot; #extension library has already been loaded, e.g. darwin + } + } + # Many dynamic extension loading problems will appear to come from # this section of code: XYZ failed at line 123 of DynaLoader.pm. # Often these errors are actually occurring in the initialisation @@ -301,13 +309,14 @@ sub bootstrap { Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); } - my $boot_symbol_ref = dl_find_symbol($libref, $bootname) or + $boot_symbol_ref = dl_find_symbol($libref, $bootname) or croak("Can't find '$bootname' symbol in $file\n"); - my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); - push(@dl_modules, $module); # record loaded module + boot: + my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); + # See comment block above &$xs(@args); } diff --git a/ext/DynaLoader/XSLoader_pm.PL b/ext/DynaLoader/XSLoader_pm.PL index 7657410d46..bc7da4adf1 100644 --- a/ext/DynaLoader/XSLoader_pm.PL +++ b/ext/DynaLoader/XSLoader_pm.PL @@ -92,6 +92,14 @@ print OUT <<'EOT'; $bootname =~ s/\W/_/g; @dl_require_symbols = ($bootname); + my $boot_symbol_ref; + + if ($^O eq 'darwin') { + if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { + goto boot; #extension library has already been loaded, e.g. darwin + } + } + # Many dynamic extension loading problems will appear to come from # this section of code: XYZ failed at line 123 of DynaLoader.pm. # Often these errors are actually occurring in the initialisation @@ -111,15 +119,16 @@ print OUT <<'EOT'; Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); } - my $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do { + $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do { require Carp; Carp::croak("Can't find '$bootname' symbol in $file\n"); }; - my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); - push(@dl_modules, $module); # record loaded module + boot: + my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); + # See comment block above return &$xs(@_); |