DynaLoader enhancement: support RTLD_GLOBAL
[p5sagit/p5-mst-13.2.git] / ext / DynaLoader / dl_hpux.xs
1 /*
2  * Author: Jeff Okamoto (okamoto@corp.hp.com)
3  * Version: 2.1, 1995/1/25
4  */
5
6 #ifdef __hp9000s300
7 #define magic hpux_magic
8 #define MAGIC HPUX_MAGIC
9 #endif
10
11 #include <dl.h>
12 #ifdef __hp9000s300
13 #undef magic
14 #undef MAGIC
15 #endif
16
17 #include "EXTERN.h"
18 #include "perl.h"
19 #include "XSUB.h"
20
21
22 #include "dlutils.c"    /* for SaveError() etc */
23
24 static AV *dl_resolve_using = Nullav;
25
26
27 static void
28 dl_private_init()
29 {
30     (void)dl_generic_private_init();
31     dl_resolve_using = perl_get_av("DynaLoader::dl_resolve_using", 0x4);
32 }
33
34 MODULE = DynaLoader     PACKAGE = DynaLoader
35
36 BOOT:
37     (void)dl_private_init();
38
39
40 void *
41 dl_load_file(filename, flags=0)
42     char *      filename
43     int         flags
44     PREINIT:
45     shl_t obj = NULL;
46     int i, max, bind_type;
47     CODE:
48     DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s,%x):\n", filename,flags));
49     if (flags & 0x01)
50         warn("Can't make loaded symbols global on this platform while loading %s",filename);
51     if (dl_nonlazy)
52         bind_type = BIND_IMMEDIATE;
53     else
54         bind_type = BIND_DEFERRED;
55 #ifdef DEBUGGING
56     if (dl_debug)
57         bind_type |= BIND_VERBOSE;
58 #endif /* DEBUGGING */
59
60     max = AvFILL(dl_resolve_using);
61     for (i = 0; i <= max; i++) {
62         char *sym = SvPVX(*av_fetch(dl_resolve_using, i, 0));
63         DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s) (dependent)\n", sym));
64         obj = shl_load(sym, bind_type | BIND_NOSTART, 0L);
65         if (obj == NULL) {
66             goto end;
67         }
68     }
69
70     DLDEBUG(1,PerlIO_printf(PerlIO_stderr(), "dl_load_file(%s): ", filename));
71     obj = shl_load(filename, bind_type | BIND_NOSTART, 0L);
72
73     DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), " libref=%x\n", obj));
74 end:
75     ST(0) = sv_newmortal() ;
76     if (obj == NULL)
77         SaveError("%s",Strerror(errno));
78     else
79         sv_setiv( ST(0), (IV)obj);
80
81
82 void *
83 dl_find_symbol(libhandle, symbolname)
84     void *      libhandle
85     char *      symbolname
86     CODE:
87     shl_t obj = (shl_t) libhandle;
88     void *symaddr = NULL;
89     int status;
90 #ifdef __hp9000s300
91     char symbolname_buf[MAXPATHLEN];
92     symbolname = dl_add_underscore(symbolname, symbolname_buf);
93 #endif
94     DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_find_symbol(handle=%x, symbol=%s)\n",
95                 libhandle, symbolname));
96     ST(0) = sv_newmortal() ;
97     errno = 0;
98
99     status = shl_findsym(&obj, symbolname, TYPE_PROCEDURE, &symaddr);
100     DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref(PROCEDURE) = %x\n", symaddr));
101
102     if (status == -1 && errno == 0) {   /* try TYPE_DATA instead */
103         status = shl_findsym(&obj, symbolname, TYPE_DATA, &symaddr);
104         DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "  symbolref(DATA) = %x\n", symaddr));
105     }
106
107     if (status == -1) {
108         SaveError("%s",(errno) ? Strerror(errno) : "Symbol not found") ;
109     } else {
110         sv_setiv( ST(0), (IV)symaddr);
111     }
112
113
114 void
115 dl_undef_symbols()
116     PPCODE:
117
118
119
120 # These functions should not need changing on any platform:
121
122 void
123 dl_install_xsub(perl_name, symref, filename="$Package")
124     char *      perl_name
125     void *      symref 
126     char *      filename
127     CODE:
128     DLDEBUG(2,PerlIO_printf(PerlIO_stderr(), "dl_install_xsub(name=%s, symref=%x)\n",
129             perl_name, symref));
130     ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)())symref, filename)));
131
132
133 char *
134 dl_error()
135     CODE:
136     RETVAL = LastError ;
137     OUTPUT:
138     RETVAL
139
140 # end.