X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FDynaLoader%2Fdl_hpux.xs;h=b5a75fe87330c580dcf1c570d32c0db314461556;hb=5aabfad66ac77650f584e2f07af91645e19fe296;hp=0558e40eaad74d14a27c5c958713ad71625dae84;hpb=a0d0e21ea6ea90a22318550944fe6cb09ae10cda;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/DynaLoader/dl_hpux.xs b/ext/DynaLoader/dl_hpux.xs index 0558e40..b5a75fe 100644 --- a/ext/DynaLoader/dl_hpux.xs +++ b/ext/DynaLoader/dl_hpux.xs @@ -1,5 +1,6 @@ /* * Author: Jeff Okamoto (okamoto@corp.hp.com) + * Version: 2.1, 1995/1/25 */ #ifdef __hp9000s300 @@ -20,11 +21,14 @@ #include "dlutils.c" /* for SaveError() etc */ +static AV *dl_resolve_using = Nullav; + static void dl_private_init() { (void)dl_generic_private_init(); + dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4); } MODULE = DynaLoader PACKAGE = DynaLoader @@ -34,17 +38,43 @@ BOOT: void * -dl_load_file(filename) - char * filename - CODE: +dl_load_file(filename, flags=0) + char * filename + int flags + PREINIT: shl_t obj = NULL; - DLDEBUG(1,fprintf(stderr,"dl_load_file(%s): ", filename)); - obj = shl_load(filename, - BIND_IMMEDIATE | BIND_NONFATAL | BIND_NOSTART | BIND_VERBOSE, 0L); - DLDEBUG(2,fprintf(stderr," libref=%x\n", obj)); + int i, max, bind_type; + CODE: + DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags)); + if (flags & 0x01) + warn("Can't make loaded symbols global on this platform while loading %s",filename); + if (dl_nonlazy) + bind_type = BIND_IMMEDIATE; + else + bind_type = BIND_DEFERRED; +#ifdef DEBUGGING + if (dl_debug) + bind_type |= BIND_VERBOSE; +#endif /* DEBUGGING */ + + max = AvFILL(dl_resolve_using); + for (i = 0; i <= max; i++) { + char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0)); + DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s) (dependent)\n", sym)); + obj = shl_load(sym, bind_type | BIND_NOSTART, 0L); + if (obj == NULL) { + goto end; + } + } + + DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s): ", filename)); + obj = shl_load(filename, bind_type | BIND_NOSTART, 0L); + + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", obj)); +end: ST(0) = sv_newmortal() ; if (obj == NULL) - SaveError("%s",Strerror(errno)) ; + SaveError("%s",Strerror(errno)); else sv_setiv( ST(0), (IV)obj); @@ -61,18 +91,27 @@ dl_find_symbol(libhandle, symbolname) char symbolname_buf[MAXPATHLEN]; symbolname = dl_add_underscore(symbolname, symbolname_buf); #endif - DLDEBUG(2,fprintf(stderr,"dl_find_symbol(handle=%x, symbol=%s)\n", + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n", libhandle, symbolname)); - status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr); - DLDEBUG(2,fprintf(stderr," symbolref = %x\n", symaddr)); ST(0) = sv_newmortal() ; - if (status == -1) + errno = 0; + + status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr); + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(PROCEDURE) = %x\n", symaddr)); + + if (status == -1 && errno == 0) { /* try TYPE_DATA instead */ + status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr); + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " symbolref(DATA) = %x\n", symaddr)); + } + + if (status == -1) { SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ; - else + } else { sv_setiv( ST(0), (IV)symaddr); + } -int +void dl_undef_symbols() PPCODE: @@ -86,7 +125,7 @@ dl_install_xsub(perl_name, symref, filename="$Package") void * symref char * filename CODE: - DLDEBUG(2,fprintf(stderr,"dl_install_xsub(name=%s, symref=%x)\n", + DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n", perl_name, symref)); ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));