summaryrefslogtreecommitdiff
path: root/ext/DynaLoader
diff options
context:
space:
mode:
authorReini Urban <rurban@cpanel.net>2015-03-12 23:45:51 +0100
committerTony Cook <tony@develop-help.com>2015-11-11 08:56:28 +1100
commitfd46a708fc894e9651374e1e8e256f365a25dffd (patch)
treeb2a05ead4e120e873f400fe6cd45e6d105fe8fb2 /ext/DynaLoader
parent067cec4c785ab7f64d2974ec6622bb9f4fa53eac (diff)
downloadperl-fd46a708fc894e9651374e1e8e256f365a25dffd.tar.gz
DynaLoader 1.36 dl_find_symbol add 3rd optional argument
On Darwin DynaLoader::bootstrap tries dl_find_symbol first with libhandle 0, to see if the shlib with the symbol is already loaded, e.g. with libc. We do not want to store the dl_last_error information for this mostly failing probe, so add an optional ign_err=0 argument. Similar for dl_find_symbol_anywhere, which is expected to fail for all librefs. Also support dl_last_error on symbian, as on all other platforms. TonyC: fix bad XS
Diffstat (limited to 'ext/DynaLoader')
-rw-r--r--ext/DynaLoader/DynaLoader_pm.PL4
-rw-r--r--ext/DynaLoader/dl_aix.xs12
-rw-r--r--ext/DynaLoader/dl_dllload.xs7
-rw-r--r--ext/DynaLoader/dl_dlopen.xs13
-rw-r--r--ext/DynaLoader/dl_dyld.xs10
-rw-r--r--ext/DynaLoader/dl_freemint.xs10
-rw-r--r--ext/DynaLoader/dl_hpux.xs5
-rw-r--r--ext/DynaLoader/dl_symbian.xs15
-rw-r--r--ext/DynaLoader/dl_vms.xs5
-rw-r--r--ext/DynaLoader/dl_win32.xs12
10 files changed, 54 insertions, 39 deletions
diff --git a/ext/DynaLoader/DynaLoader_pm.PL b/ext/DynaLoader/DynaLoader_pm.PL
index 376b03c252..5166cc4c31 100644
--- a/ext/DynaLoader/DynaLoader_pm.PL
+++ b/ext/DynaLoader/DynaLoader_pm.PL
@@ -376,7 +376,7 @@ sub bootstrap {
my $boot_symbol_ref;
<<$^O-eq-darwin>>
- if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) {
+ if ($boot_symbol_ref = dl_find_symbol(0, $bootname, 1)) {
goto boot; #extension library has already been loaded, e.g. darwin
}
<</$^O-eq-darwin>>
@@ -545,7 +545,7 @@ sub dl_find_symbol_anywhere
my $sym = shift;
my $libref;
foreach $libref (@dl_librefs) {
- my $symref = dl_find_symbol($libref,$sym);
+ my $symref = dl_find_symbol($libref,$sym,1);
return $symref if $symref;
}
return undef;
diff --git a/ext/DynaLoader/dl_aix.xs b/ext/DynaLoader/dl_aix.xs
index 137af19d4d..c95d6c581d 100644
--- a/ext/DynaLoader/dl_aix.xs
+++ b/ext/DynaLoader/dl_aix.xs
@@ -721,9 +721,10 @@ dl_unload_file(libref)
RETVAL
void
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
void *retv;
CODE:
@@ -731,10 +732,11 @@ dl_find_symbol(libhandle, symbolname)
libhandle, symbolname));
retv = dlsym(libhandle, symbolname);
DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref = %x\n", retv));
- ST(0) = sv_newmortal() ;
- if (retv == NULL)
- SaveError(aTHX_ "%s",dlerror()) ;
- else
+ ST(0) = sv_newmortal();
+ if (retv == NULL) {
+ if (!ign_err)
+ SaveError(aTHX_ "%s", dlerror());
+ } else
sv_setiv( ST(0), PTR2IV(retv));
diff --git a/ext/DynaLoader/dl_dllload.xs b/ext/DynaLoader/dl_dllload.xs
index aac2f7bd76..838245d70f 100644
--- a/ext/DynaLoader/dl_dllload.xs
+++ b/ext/DynaLoader/dl_dllload.xs
@@ -141,9 +141,10 @@ dl_unload_file(libref)
void
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
void *retv;
PPCODE:
@@ -154,9 +155,9 @@ dl_find_symbol(libhandle, symbolname)
retv = dllqueryvar(libhandle, symbolname);
DLDEBUG(2, PerlIO_printf(Perl_debug_log,
" symbolref = %lx\n", (unsigned long) retv));
- ST(0) = sv_newmortal() ;
+ ST(0) = sv_newmortal();
if (retv == NULL)
- SaveError(aTHX_ "%s",strerror(errno)) ;
+ if (!ign_err) SaveError(aTHX_ "%s", strerror(errno));
else
sv_setiv( ST(0), PTR2IV(retv));
XSRETURN(1);
diff --git a/ext/DynaLoader/dl_dlopen.xs b/ext/DynaLoader/dl_dlopen.xs
index d4fea890f8..172da13ce7 100644
--- a/ext/DynaLoader/dl_dlopen.xs
+++ b/ext/DynaLoader/dl_dlopen.xs
@@ -12,6 +12,7 @@
* basic FreeBSD support, removed ClearError
* 29th February 2000 - Alan Burlison: Added functionality to close dlopen'd
* files when the interpreter exits
+ * 2015-03-12 - rurban: Added optional 3rd dl_find_symbol argument
*
*/
@@ -217,9 +218,10 @@ dl_unload_file(libref)
void
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
void *sym;
CODE:
@@ -232,10 +234,11 @@ dl_find_symbol(libhandle, symbolname)
sym = dlsym(libhandle, symbolname);
DLDEBUG(2, PerlIO_printf(Perl_debug_log,
" symbolref = %lx\n", (unsigned long) sym));
- ST(0) = sv_newmortal() ;
- if (sym == NULL)
- SaveError(aTHX_ "%s",dlerror()) ;
- else
+ ST(0) = sv_newmortal();
+ if (sym == NULL) {
+ if (!ign_err)
+ SaveError(aTHX_ "%s", dlerror());
+ } else
sv_setiv( ST(0), PTR2IV(sym));
diff --git a/ext/DynaLoader/dl_dyld.xs b/ext/DynaLoader/dl_dyld.xs
index 7822878518..45361ed858 100644
--- a/ext/DynaLoader/dl_dyld.xs
+++ b/ext/DynaLoader/dl_dyld.xs
@@ -174,9 +174,10 @@ dl_load_file(filename, flags=0)
void *
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
CODE:
symbolname = Perl_form_nocontext("_%s", symbolname);
DLDEBUG(2, PerlIO_printf(Perl_debug_log,
@@ -186,9 +187,10 @@ dl_find_symbol(libhandle, symbolname)
DLDEBUG(2, PerlIO_printf(Perl_debug_log,
" symbolref = %lx\n", (unsigned long) RETVAL));
ST(0) = sv_newmortal() ;
- if (RETVAL == NULL)
- SaveError(aTHX_ "%s",dlerror()) ;
- else
+ if (RETVAL == NULL) {
+ if (!ign_err)
+ SaveError(aTHX_ "%s",dlerror()) ;
+ } else
sv_setiv( ST(0), PTR2IV(RETVAL) );
diff --git a/ext/DynaLoader/dl_freemint.xs b/ext/DynaLoader/dl_freemint.xs
index 9ecafa03c7..9f37257006 100644
--- a/ext/DynaLoader/dl_freemint.xs
+++ b/ext/DynaLoader/dl_freemint.xs
@@ -144,9 +144,10 @@ haverror:
void
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
void *retv;
CODE:
@@ -155,9 +156,10 @@ dl_find_symbol(libhandle, symbolname)
retv = (void *)dld_get_func(symbolname);
DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref = %x\n", (unsigned int)retv));
ST(0) = sv_newmortal() ;
- if (retv == NULL)
- SaveError(aTHX_ "dl_find_symbol: Unable to find '%s' symbol", symbolname) ;
- else
+ if (retv == NULL) {
+ if (!ign_err)
+ SaveError(aTHX_ "dl_find_symbol: Unable to find '%s' symbol", symbolname) ;
+ } else
sv_setiv(ST(0), PTR2IV(retv));
XSRETURN(1);
diff --git a/ext/DynaLoader/dl_hpux.xs b/ext/DynaLoader/dl_hpux.xs
index 0ed0173e82..82cee5430d 100644
--- a/ext/DynaLoader/dl_hpux.xs
+++ b/ext/DynaLoader/dl_hpux.xs
@@ -118,9 +118,10 @@ dl_unload_file(libref)
void
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
shl_t obj = (shl_t) libhandle;
void *symaddr = NULL;
@@ -145,7 +146,7 @@ dl_find_symbol(libhandle, symbolname)
}
if (status == -1) {
- SaveError(aTHX_ "%s",(errno) ? Strerror(errno) : "Symbol not found") ;
+ if (!ign_err) SaveError(aTHX_ "%s",(errno) ? Strerror(errno) : "Symbol not found") ;
} else {
sv_setiv( ST(0), PTR2IV(symaddr) );
}
diff --git a/ext/DynaLoader/dl_symbian.xs b/ext/DynaLoader/dl_symbian.xs
index 562b034c04..d75bb8195d 100644
--- a/ext/DynaLoader/dl_symbian.xs
+++ b/ext/DynaLoader/dl_symbian.xs
@@ -163,8 +163,8 @@ dl_load_file(filename, flags=0)
if (h && h->error == KErrNone)
sv_setiv(ST(0), PTR2IV(h));
else
- PerlIO_printf(Perl_debug_log, "(dl_load_file %s %d)",
- filename, h ? h->error : -1);
+ SaveError(aTHX_ "(dl_load_file %s %d)"
+ filename, h ? h->error : -1);
}
@@ -178,20 +178,23 @@ dl_unload_file(libhandle)
void
-dl_find_symbol(libhandle, symbolname)
+ dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
void *sym;
CODE:
PerlSymbianLibHandle* h = (PerlSymbianLibHandle*)libhandle;
sym = dlsym(libhandle, symbolname);
ST(0) = sv_newmortal();
- if (sym)
+ if (sym) {
sv_setiv(ST(0), PTR2IV(sym));
- else
- PerlIO_printf(Perl_debug_log, "(dl_find_symbol %s %d)",
+ } else {
+ if (!ign_err)
+ SaveError(aTHX_ "(dl_find_symbol %s %d)",
symbolname, h ? h->error : -1);
+ }
void
diff --git a/ext/DynaLoader/dl_vms.xs b/ext/DynaLoader/dl_vms.xs
index ca8d54f6d2..1a17793a52 100644
--- a/ext/DynaLoader/dl_vms.xs
+++ b/ext/DynaLoader/dl_vms.xs
@@ -301,9 +301,10 @@ dl_load_file(filename, flags=0)
void
-dl_find_symbol(librefptr,symname)
+dl_find_symbol(librefptr,symname,ign_err=0)
void * librefptr
SV * symname
+ int ign_err
PREINIT:
struct libref thislib = *((struct libref *)librefptr);
struct dsc$descriptor_s
@@ -321,7 +322,7 @@ dl_find_symbol(librefptr,symname)
DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tentry point is %d\n",
(unsigned long int) entry));
if (!(sts & 1)) {
- dl_set_error(sts,0);
+ if (!ign_err) dl_set_error(sts,0);
ST(0) = &PL_sv_undef;
}
else ST(0) = sv_2mortal(newSViv(PTR2IV(entry)));
diff --git a/ext/DynaLoader/dl_win32.xs b/ext/DynaLoader/dl_win32.xs
index 605b63fda3..2177b3b231 100644
--- a/ext/DynaLoader/dl_win32.xs
+++ b/ext/DynaLoader/dl_win32.xs
@@ -157,9 +157,10 @@ dl_unload_file(libref)
RETVAL
void
-dl_find_symbol(libhandle, symbolname)
+dl_find_symbol(libhandle, symbolname, ign_err=0)
void * libhandle
char * symbolname
+ int ign_err
PREINIT:
void *retv;
CODE:
@@ -167,11 +168,10 @@ dl_find_symbol(libhandle, symbolname)
libhandle, symbolname));
retv = (void*) GetProcAddress((HINSTANCE) libhandle, symbolname);
DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref = %x\n", retv));
- ST(0) = sv_newmortal() ;
- if (retv == NULL)
- SaveError(aTHX_ "find_symbol:%s",
- OS_Error_String(aTHX)) ;
- else
+ ST(0) = sv_newmortal();
+ if (retv == NULL) {
+ if (!ign_err) SaveError(aTHX_ "find_symbol:%s", OS_Error_String(aTHX));
+ } else
sv_setiv( ST(0), (IV)retv);