Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PATCH 8-10/11] DynaLoader 1.33 various #14587

Closed
p5pRT opened this issue Mar 14, 2015 · 15 comments
Closed

[PATCH 8-10/11] DynaLoader 1.33 various #14587

p5pRT opened this issue Mar 14, 2015 · 15 comments

Comments

@p5pRT
Copy link

p5pRT commented Mar 14, 2015

Migrated from rt.perl.org#124068 (status was 'resolved')

Searchable as RT124068$

@p5pRT
Copy link
Author

p5pRT commented Mar 14, 2015

From @rurban

This is a bug report for perl from rurban@​cpanel.net,
generated with the help of perlbug 1.40 running under perl 5.21.9.


3 DynaLoader patches​:
DynaLoader 1.33 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.

DynaLoader/dl_*.xs​: Define all PERL_IN_DL_*_XS markers
On Symbian harmonize with the rest.

extend t/DynaLoader.t to be run from basedir also. This simplifies testing
from core.



Flags​:
  category=library
  severity=medium
  Type=Patch
  PatchStatus=HasPatch
  module=DynaLoader


Site configuration information for perl 5.21.9​:

Configured by rurban at Sun Feb 22 17​:14​:55 CET 2015.

Summary of my perl5 (revision 5 version 21 subversion 9) configuration​:
 
  Platform​:
  osname=linux, osvers=3.16.0-4-amd64, archname=x86_64-linux-debug
  uname='linux reini 3.16.0-4-amd64 #1 smp debian 3.16.7-ckt2-1 (2014-12-08) x86_64 gnulinux '
  config_args='-de -Dusedevel -Uversiononly -Dinstallman1dir=none -Dinstallman3dir=none -Dinstallsiteman1dir=none -Dinstallsiteman3dir=none -DEBUGGING -Doptimize='-g3' -Uuseithreads -D'cc=gcc-5.0' -Accflags=''-msse4.2'' -Accflags=''-march=corei7'' -Dcf_email=''rurban@​cpanel.net'' -Dperladmin=''rurban@​cpanel.net'''
  hint=recommended, useposix=true, d_sigaction=define
  useithreads=undef, usemultiplicity=undef
  use64bitint=define, use64bitall=define, uselongdouble=undef
  usemymalloc=n, bincompat5005=undef
  Compiler​:
  cc='gcc-5.0', ccflags ='-msse4.2 -march=corei7 -fwrapv -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
  optimize='-g3',
  cppflags='-msse4.2 -march=corei7 -fwrapv -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include'
  ccversion='', gccversion='5.0.0 20150103 (experimental)', gccosandvers=''
  intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3
  d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3
  ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
  alignbytes=8, prototype=define
  Linker and Libraries​:
  ld='gcc-5.0', ldflags =' -fstack-protector-strong -L/usr/local/lib'
  libpth=/usr/local/lib /usr/local/lib/gcc/x86_64-unknown-linux-gnu/5.0.0/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /lib64 /usr/lib64 /usr/local/lib64
  libs=-lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
  perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
  libc=libc-2.19.so, so=so, useshrplib=false, libperl=libperl.a
  gnulibc_version='2.19'
  Dynamic Linking​:
  dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
  cccdlflags='-fPIC', lddlflags='-shared -g3 -L/usr/local/lib -fstack-protector-strong'

Locally applied patches​:
  Devel​::PatchPerl 1.30


@​INC for perl 5.21.9​:
  /usr/local/lib/perl5/site_perl/5.21.9/x86_64-linux-debug
  /usr/local/lib/perl5/site_perl/5.21.9
  /usr/local/lib/perl5/5.21.9/x86_64-linux-debug
  /usr/local/lib/perl5/5.21.9
  /usr/local/lib/perl5/site_perl/5.21.8
  /usr/local/lib/perl5/site_perl/5.21.7
  /usr/local/lib/perl5/site_perl/5.21.4
  /usr/local/lib/perl5/site_perl/5.21.3
  /usr/local/lib/perl5/site_perl/5.21.2
  /usr/local/lib/perl5/site_perl/5.21.1
  /usr/local/lib/perl5/site_perl/5.21.0
  /usr/local/lib/perl5/site_perl/5.20.1
  /usr/local/lib/perl5/site_perl/5.20.0
  /usr/local/lib/perl5/site_perl/5.19.11
  /usr/local/lib/perl5/site_perl/5.19.10
  /usr/local/lib/perl5/site_perl/5.19.9
  /usr/local/lib/perl5/site_perl/5.19.8
  /usr/local/lib/perl5/site_perl/5.19.7
  /usr/local/lib/perl5/site_perl/5.19.6
  /usr/local/lib/perl5/site_perl/5.19.5
  /usr/local/lib/perl5/site_perl/5.19.4
  /usr/local/lib/perl5/site_perl/5.19.3
  /usr/local/lib/perl5/site_perl/5.19.2
  /usr/local/lib/perl5/site_perl/5.19.1
  /usr/local/lib/perl5/site_perl/5.19.0
  /usr/local/lib/perl5/site_perl/5.18.4
  /usr/local/lib/perl5/site_perl/5.18.2
  /usr/local/lib/perl5/site_perl/5.18.1
  /usr/local/lib/perl5/site_perl/5.18.0
  /usr/local/lib/perl5/site_perl/5.17.11
  /usr/local/lib/perl5/site_perl/5.17.10
  /usr/local/lib/perl5/site_perl/5.17.8
  /usr/local/lib/perl5/site_perl/5.17.7
  /usr/local/lib/perl5/site_perl/5.17.6
  /usr/local/lib/perl5/site_perl/5.17.5
  /usr/local/lib/perl5/site_perl/5.17.4
  /usr/local/lib/perl5/site_perl/5.17.3
  /usr/local/lib/perl5/site_perl/5.17.2
  /usr/local/lib/perl5/site_perl/5.17.1
  /usr/local/lib/perl5/site_perl/5.17.0
  /usr/local/lib/perl5/site_perl/5.17
  /usr/local/lib/perl5/site_perl/5.16.3
  /usr/local/lib/perl5/site_perl/5.16.2
  /usr/local/lib/perl5/site_perl/5.16.1
  /usr/local/lib/perl5/site_perl/5.16.0
  /usr/local/lib/perl5/site_perl/5.15.9
  /usr/local/lib/perl5/site_perl/5.15.8
  /usr/local/lib/perl5/site_perl/5.15.7
  /usr/local/lib/perl5/site_perl/5.15.6
  /usr/local/lib/perl5/site_perl/5.15.5
  /usr/local/lib/perl5/site_perl/5.15.4
  /usr/local/lib/perl5/site_perl/5.15.3
  /usr/local/lib/perl5/site_perl/5.15.2
  /usr/local/lib/perl5/site_perl/5.14.4
  /usr/local/lib/perl5/site_perl/5.14.3
  /usr/local/lib/perl5/site_perl/5.14.2
  /usr/local/lib/perl5/site_perl/5.14.1
  /usr/local/lib/perl5/site_perl/5.12.5
  /usr/local/lib/perl5/site_perl/5.12.4
  /usr/local/lib/perl5/site_perl/5.10.1
  /usr/local/lib/perl5/site_perl/5.8.9
  /usr/local/lib/perl5/site_perl/5.8.8
  /usr/local/lib/perl5/site_perl/5.8.7
  /usr/local/lib/perl5/site_perl/5.8.6
  /usr/local/lib/perl5/site_perl/5.8.5
  /usr/local/lib/perl5/site_perl/5.8.4
  /usr/local/lib/perl5/site_perl/5.8.3
  /usr/local/lib/perl5/site_perl/5.8.2
  /usr/local/lib/perl5/site_perl/5.8.1
  /usr/local/lib/perl5/site_perl/5.6.2
  /usr/local/lib/perl5/site_perl
  .


Environment for perl 5.21.9​:
  HOME=/home/rurban
  LANG=en_US.utf8
  LANGUAGE (unset)
  LD_LIBRARY_PATH (unset)
  LOGDIR (unset)
  PATH=/home/rurban/bin​:/usr/local/bin​:/usr/bin​:/bin​:/usr/local/games​:/usr/games
  PERL_BADLANG (unset)
  SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Mar 14, 2015

From @rurban

0001-DynaLoader-1.33-dl_find_symbol-add-3rd-optional-argu.patch
From 55bd87dd771088846624e0f790443631d23ef09e Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Thu, 12 Mar 2015 23:45:51 +0100
Subject: [PATCH 1/4] DynaLoader 1.33 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.
---
 ext/DynaLoader/DynaLoader_pm.PL |  6 +++---
 ext/DynaLoader/dl_aix.xs        | 12 +++++++-----
 ext/DynaLoader/dl_dllload.xs    |  7 ++++---
 ext/DynaLoader/dl_dlopen.xs     | 13 ++++++++-----
 ext/DynaLoader/dl_dyld.xs       | 10 ++++++----
 ext/DynaLoader/dl_freemint.xs   | 10 ++++++----
 ext/DynaLoader/dl_hpux.xs       |  5 +++--
 ext/DynaLoader/dl_symbian.xs    | 15 +++++++++------
 ext/DynaLoader/dl_vms.xs        |  5 +++--
 ext/DynaLoader/dl_win32.xs      | 12 ++++++------
 10 files changed, 55 insertions(+), 40 deletions(-)

diff --git ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/DynaLoader_pm.PL
index 45dd6d3..bc8e6bb 100644
--- ext/DynaLoader/DynaLoader_pm.PL
+++ ext/DynaLoader/DynaLoader_pm.PL
@@ -85,7 +85,7 @@ package DynaLoader;
 # Tim.Bunce@ig.co.uk, August 1994
 
 BEGIN {
-    $VERSION = '1.32';
+    $VERSION = '1.33';
 }
 
 use Config;
@@ -372,7 +372,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>>
@@ -543,7 +543,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 ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_aix.xs
index 137af19..c95d6c5 100644
--- ext/DynaLoader/dl_aix.xs
+++ 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 ext/DynaLoader/dl_dllload.xs ext/DynaLoader/dl_dllload.xs
index aac2f7b..838245d 100644
--- ext/DynaLoader/dl_dllload.xs
+++ 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 ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_dlopen.xs
index 3dce1ef..2ff9019 100644
--- ext/DynaLoader/dl_dlopen.xs
+++ 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
  *
  */
 
@@ -216,9 +217,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:
@@ -231,10 +233,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 ext/DynaLoader/dl_dyld.xs ext/DynaLoader/dl_dyld.xs
index 7822878..45361ed 100644
--- ext/DynaLoader/dl_dyld.xs
+++ 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 ext/DynaLoader/dl_freemint.xs ext/DynaLoader/dl_freemint.xs
index 9ecafa0..9f37257 100644
--- ext/DynaLoader/dl_freemint.xs
+++ 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 ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_hpux.xs
index 0ed0173..82cee54 100644
--- ext/DynaLoader/dl_hpux.xs
+++ 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 ext/DynaLoader/dl_symbian.xs ext/DynaLoader/dl_symbian.xs
index 562b034..d75bb81 100644
--- ext/DynaLoader/dl_symbian.xs
+++ 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 ext/DynaLoader/dl_vms.xs ext/DynaLoader/dl_vms.xs
index ca8d54f..1a17793 100644
--- ext/DynaLoader/dl_vms.xs
+++ 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 ext/DynaLoader/dl_win32.xs ext/DynaLoader/dl_win32.xs
index 605b63f..e916f7e 100644
--- ext/DynaLoader/dl_win32.xs
+++ 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);
 
 
-- 
2.1.4

@p5pRT
Copy link
Author

p5pRT commented Mar 14, 2015

From @rurban

0002-DynaLoader-dl_-.xs-Define-all-PERL_IN_DL_-_XS-marker.patch
From 8a6ad40879464caa88483a9b9a703a69a95519b6 Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Sat, 14 Mar 2015 10:04:53 +0100
Subject: [PATCH 2/4] DynaLoader/dl_*.xs: Define all PERL_IN_DL_*_XS markers

On Symbian harmonize with the rest.
---
 ext/DynaLoader/dl_aix.xs      | 1 +
 ext/DynaLoader/dl_dllload.xs  | 1 +
 ext/DynaLoader/dl_dyld.xs     | 1 +
 ext/DynaLoader/dl_freemint.xs | 1 +
 ext/DynaLoader/dl_none.xs     | 1 +
 ext/DynaLoader/dl_symbian.xs  | 2 +-
 ext/DynaLoader/dl_vms.xs      | 1 +
 ext/DynaLoader/dl_win32.xs    | 1 +
 symbian/symbian_proto.h       | 2 +-
 9 files changed, 9 insertions(+), 2 deletions(-)

diff --git ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_aix.xs
index c95d6c5..8e7d8ac 100644
--- ext/DynaLoader/dl_aix.xs
+++ ext/DynaLoader/dl_aix.xs
@@ -13,6 +13,7 @@
 
 #define PERLIO_NOT_STDIO 0
 #define PERL_EXT
+#define PERL_IN_DL_AIX_XS
 
 /*
  * On AIX 4.3 and above the emulation layer is not needed any more, and
diff --git ext/DynaLoader/dl_dllload.xs ext/DynaLoader/dl_dllload.xs
index 838245d..84484d6 100644
--- ext/DynaLoader/dl_dllload.xs
+++ ext/DynaLoader/dl_dllload.xs
@@ -86,6 +86,7 @@
 
 #define PERL_EXT
 #include "EXTERN.h"
+#define PERL_IN_DL_DLLLOAD_XS
 #include "perl.h"
 #include "XSUB.h"
 
diff --git ext/DynaLoader/dl_dyld.xs ext/DynaLoader/dl_dyld.xs
index 45361ed..38a3840 100644
--- ext/DynaLoader/dl_dyld.xs
+++ ext/DynaLoader/dl_dyld.xs
@@ -41,6 +41,7 @@ been tested on NeXT platforms.
 
 #define PERL_EXT
 #include "EXTERN.h"
+#define PERL_IN_DL_DYLD_XS
 #include "perl.h"
 #include "XSUB.h"
 
diff --git ext/DynaLoader/dl_freemint.xs ext/DynaLoader/dl_freemint.xs
index 9f37257..e932a42 100644
--- ext/DynaLoader/dl_freemint.xs
+++ ext/DynaLoader/dl_freemint.xs
@@ -39,6 +39,7 @@
 
 #define PERL_EXT
 #include "EXTERN.h"
+#define PERL_IN_DL_FREEMINT_XS
 #include "perl.h"
 #include "XSUB.h"
 
diff --git ext/DynaLoader/dl_none.xs ext/DynaLoader/dl_none.xs
index 2914177..d2cb2bc 100644
--- ext/DynaLoader/dl_none.xs
+++ ext/DynaLoader/dl_none.xs
@@ -5,6 +5,7 @@
 
 #define PERL_EXT
 #include "EXTERN.h"
+#define PERL_IN_DL_NONE_XS
 #include "perl.h"
 #include "XSUB.h"
 
diff --git ext/DynaLoader/dl_symbian.xs ext/DynaLoader/dl_symbian.xs
index d75bb81..3d3c038 100644
--- ext/DynaLoader/dl_symbian.xs
+++ ext/DynaLoader/dl_symbian.xs
@@ -25,8 +25,8 @@
  * only after that the Perl ones.  Otherwise you will get a lot
  * trouble because of Symbian's New(), Copy(), etc definitions. */
 
-#define DL_SYMBIAN_XS
 #define PERL_EXT
+#define PERL_IN_DL_SYMBIAN_XS
 
 #include "EXTERN.h"
 #include "perl.h"
diff --git ext/DynaLoader/dl_vms.xs ext/DynaLoader/dl_vms.xs
index 1a17793..6a32fc1 100644
--- ext/DynaLoader/dl_vms.xs
+++ ext/DynaLoader/dl_vms.xs
@@ -47,6 +47,7 @@
 
 #define PERL_EXT
 #include "EXTERN.h"
+#define PERL_IN_DL_VMS_XS
 #include "perl.h"
 #include "XSUB.h"
 
diff --git ext/DynaLoader/dl_win32.xs ext/DynaLoader/dl_win32.xs
index e916f7e..b5104d8 100644
--- ext/DynaLoader/dl_win32.xs
+++ ext/DynaLoader/dl_win32.xs
@@ -26,6 +26,7 @@ calls.
 
 #define PERL_NO_GET_CONTEXT
 #define PERL_EXT
+#define PERL_IN_DL_WIN32_XS
 
 #include "EXTERN.h"
 #include "perl.h"
diff --git symbian/symbian_proto.h symbian/symbian_proto.h
index d289fb4..7226663 100644
--- symbian/symbian_proto.h
+++ symbian/symbian_proto.h
@@ -17,7 +17,7 @@
 /* We can't include the <string.h> unconditionally
  * since it has prototypes conflicting with the gcc builtins. */
 extern void  *memchr(const void *s, int c, size_t n);
-#ifndef DL_SYMBIAN_XS
+#ifndef PERL_IN_DL_SYMBIAN_XS
 /* dl_symbian.xs needs to see the C++ prototype of memset() instead */
 extern void  *memset(void *s, int c, size_t n);
 extern size_t strlen(const char *s);
-- 
2.1.4

@p5pRT
Copy link
Author

p5pRT commented Mar 14, 2015

From @rurban

0003-DynaLoader-extend-t-DynaLoader.t-to-be-run-from-base.patch
From 02674f4e5b1d20cca57193b2f7246a8461e6818a Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Wed, 11 Mar 2015 18:11:53 +0100
Subject: [PATCH 3/4] DynaLoader: extend t/DynaLoader.t to be run from basedir
 also

This simplifies testing from core.
---
 ext/DynaLoader/t/DynaLoader.t | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git ext/DynaLoader/t/DynaLoader.t ext/DynaLoader/t/DynaLoader.t
index 3ac8d08..31cb4e4 100644
--- ext/DynaLoader/t/DynaLoader.t
+++ ext/DynaLoader/t/DynaLoader.t
@@ -2,7 +2,12 @@
 
 use strict;
 use Config;
-require '../../t/test.pl';
+push @INC, '.';
+if (-f 't/test.pl') {
+  require 't/test.pl';
+} else {
+  require '../../t/test.pl';
+}
 
 my %modules;
 
-- 
2.1.4

@p5pRT
Copy link
Author

p5pRT commented Mar 29, 2015

From @tonycoz

On Sat Mar 14 03​:56​:00 2015, rurban@​cpanel.net wrote​:

3 DynaLoader patches​:
DynaLoader 1.33 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.

DynaLoader/dl_*.xs​: Define all PERL_IN_DL_*_XS markers
On Symbian harmonize with the rest.

extend t/DynaLoader.t to be run from basedir also. This simplifies
testing
from core.

This patch breaks the build on Win32, presumably because of this​:

--- ext/DynaLoader/dl_win32.xs
+++ 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

Tony

@p5pRT
Copy link
Author

p5pRT commented Mar 29, 2015

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Apr 3, 2015

From @rurban

On 03/30/2015 01​:38 AM, Tony Cook via RT wrote​:

On Sat Mar 14 03​:56​:00 2015, rurban@​cpanel.net wrote​:

3 DynaLoader patches​:
DynaLoader 1.33 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.

DynaLoader/dl_*.xs​: Define all PERL_IN_DL_*_XS markers
On Symbian harmonize with the rest.

extend t/DynaLoader.t to be run from basedir also. This simplifies
testing
from core.

This patch breaks the build on Win32, presumably because of this​:

--- ext/DynaLoader/dl_win32.xs
+++ 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

Tony

Good catch. I didn't test win32 and symbian.
Fixed in the attached version.

@p5pRT
Copy link
Author

p5pRT commented Apr 3, 2015

From @rurban

0001-DynaLoader-1.33-dl_find_symbol-add-3rd-optional-argu.patch
From 55bd87dd771088846624e0f790443631d23ef09e Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Thu, 12 Mar 2015 23:45:51 +0100
Subject: [PATCH 01/37] DynaLoader 1.33 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.
---
 ext/DynaLoader/DynaLoader_pm.PL |  6 +++---
 ext/DynaLoader/dl_aix.xs        | 12 +++++++-----
 ext/DynaLoader/dl_dllload.xs    |  7 ++++---
 ext/DynaLoader/dl_dlopen.xs     | 13 ++++++++-----
 ext/DynaLoader/dl_dyld.xs       | 10 ++++++----
 ext/DynaLoader/dl_freemint.xs   | 10 ++++++----
 ext/DynaLoader/dl_hpux.xs       |  5 +++--
 ext/DynaLoader/dl_symbian.xs    | 15 +++++++++------
 ext/DynaLoader/dl_vms.xs        |  5 +++--
 ext/DynaLoader/dl_win32.xs      | 12 ++++++------
 10 files changed, 55 insertions(+), 40 deletions(-)

diff --git ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/DynaLoader_pm.PL
index 45dd6d3..bc8e6bb 100644
--- ext/DynaLoader/DynaLoader_pm.PL
+++ ext/DynaLoader/DynaLoader_pm.PL
@@ -85,7 +85,7 @@ package DynaLoader;
 # Tim.Bunce@ig.co.uk, August 1994
 
 BEGIN {
-    $VERSION = '1.32';
+    $VERSION = '1.33';
 }
 
 use Config;
@@ -372,7 +372,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>>
@@ -543,7 +543,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 ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_aix.xs
index 137af19..c95d6c5 100644
--- ext/DynaLoader/dl_aix.xs
+++ 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 ext/DynaLoader/dl_dllload.xs ext/DynaLoader/dl_dllload.xs
index aac2f7b..838245d 100644
--- ext/DynaLoader/dl_dllload.xs
+++ 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 ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_dlopen.xs
index 3dce1ef..2ff9019 100644
--- ext/DynaLoader/dl_dlopen.xs
+++ 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
  *
  */
 
@@ -216,9 +217,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:
@@ -231,10 +233,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 ext/DynaLoader/dl_dyld.xs ext/DynaLoader/dl_dyld.xs
index 7822878..45361ed 100644
--- ext/DynaLoader/dl_dyld.xs
+++ 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 ext/DynaLoader/dl_freemint.xs ext/DynaLoader/dl_freemint.xs
index 9ecafa0..9f37257 100644
--- ext/DynaLoader/dl_freemint.xs
+++ 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 ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_hpux.xs
index 0ed0173..82cee54 100644
--- ext/DynaLoader/dl_hpux.xs
+++ 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 ext/DynaLoader/dl_symbian.xs ext/DynaLoader/dl_symbian.xs
index 562b034..d75bb81 100644
--- ext/DynaLoader/dl_symbian.xs
+++ 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 ext/DynaLoader/dl_vms.xs ext/DynaLoader/dl_vms.xs
index ca8d54f..1a17793 100644
--- ext/DynaLoader/dl_vms.xs
+++ 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 ext/DynaLoader/dl_win32.xs ext/DynaLoader/dl_win32.xs
index 605b63f..e916f7e 100644
--- ext/DynaLoader/dl_win32.xs
+++ 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);
 
 
-- 
2.1.4

@p5pRT
Copy link
Author

p5pRT commented Jun 10, 2015

From @bulk88

I think this patch is poorly thought out. It is adding args to every platform, when this is strictly a problem on 1 OS (darwin). Why not hard code dl_find_symbol on darwin to NOT save the error if libhandle is 0 in C?

--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

p5pRT commented Jun 14, 2015

From @rurban

On 06/10/2015 07​:52 AM, bulk88 via RT wrote​:

I think this patch is poorly thought out. It is adding args to every platform, when this is strictly a problem on 1 OS (darwin). Why not hard code dl_find_symbol on darwin to NOT save the error if libhandle is 0 in C?

It's not poorly thought out.
Of course since it is only needed for Darwin I tried to fix that for
Darwin only initially.

But the problem is that this is a documented API call, so I had to add
the dummy arg to all the others also.

It's only a very tiny performance win, so I don't care that much though.
But I thought you care, because it is on your 2-5% perf. range, so I
posted it to you.

--
Reini

Working towards a true Modern Perl.
Slim, functional, unbloated, compile-time optimizable

@p5pRT
Copy link
Author

p5pRT commented Oct 14, 2015

From @tonycoz

On Sun Jun 14 10​:29​:32 2015, rurban@​cpanel.net wrote​:

On 06/10/2015 07​:52 AM, bulk88 via RT wrote​:

I think this patch is poorly thought out. It is adding args to every
platform, when this is strictly a problem on 1 OS (darwin). Why not
hard code dl_find_symbol on darwin to NOT save the error if libhandle
is 0 in C?

It's not poorly thought out.
Of course since it is only needed for Darwin I tried to fix that for
Darwin only initially.

But the problem is that this is a documented API call, so I had to add
the dummy arg to all the others also.

It's only a very tiny performance win, so I don't care that much
though.
But I thought you care, because it is on your 2-5% perf. range, so I
posted it to you.

Despite bulk88's argument I'm inclined to apply it. One issue is, you've modified dl_find_symbol() to SaveError() the string that was originally printed to the debug log.

Unfortunately that original code is wrong - h->error is only set in dlopen(), and even there it always seems to set it to KErrNone.

I tried looking for Symbian API documentation to see if there was a usable error code that could be displayed, but unfortunately I couldn't find any documentation, Symbian seems to be dead and buried.

Tony

@p5pRT
Copy link
Author

p5pRT commented Oct 15, 2015

From @jhi

If Symbian breaks, that would be good news in the sense that it would not be dead, then. So go ahead in that regard.

(Even though I did the Symbian port... ages ago... I no more have any access, nor I know of any who has/cares. Symbian was opensourced at some point, I think, but it seemed not to slow the disappearance. Kind of like PalmOS these days.)

@p5pRT
Copy link
Author

p5pRT commented Nov 10, 2015

From @tonycoz

On Fri Apr 03 02​:59​:37 2015, rurban@​cpanel.net wrote​:

On 03/30/2015 01​:38 AM, Tony Cook via RT wrote​:

This patch breaks the build on Win32, presumably because of this​:

--- ext/DynaLoader/dl_win32.xs
+++ 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

Good catch. I didn't test win32 and symbian.
Fixed in the attached version.

The updated patch didn't fix those.

With fixes, applied as fd46a70, d96ba2c, 6d0927b.

I originally missed the bad symbian XS, which is fixed in fdfd5e4.

Tony

@p5pRT
Copy link
Author

p5pRT commented Nov 10, 2015

@tonycoz - Status changed from 'open' to 'resolved'

@p5pRT p5pRT closed this as completed Nov 10, 2015
@p5pRT
Copy link
Author

p5pRT commented Nov 25, 2015

From @tonycoz

On Tue Nov 10 14​:28​:36 2015, tonyc wrote​:

I originally missed the bad symbian XS, which is fixed in
fdfd5e4.

Also a further fix in 093d5aa for an else nesting error.

Tony

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant