#include <dld.h> /* GNU DLD header file */
#include <unistd.h>
+typedef struct {
+ AV * x_resolve_using;
+ AV * x_require_symbols;
+} my_cxtx_t; /* this *must* be named my_cxtx_t */
+
+#define DL_CXT_EXTRA /* ask for dl_cxtx to be defined in dlutils.c */
#include "dlutils.c" /* for SaveError() etc */
-static AV *dl_resolve_using = Nullav;
-static AV *dl_require_symbols = Nullav;
+#define dl_resolve_using (dl_cxtx.x_resolve_using)
+#define dl_require_symbols (dl_cxtx.x_require_symbols)
static void
dl_private_init(pTHX)
{
- int dlderr;
dl_generic_private_init(aTHX);
- dl_resolve_using = get_av("DynaLoader::dl_resolve_using", 0x4);
- dl_require_symbols = get_av("DynaLoader::dl_require_symbols", 0x4);
+ {
+ int dlderr;
+ dMY_CXT;
+
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+ dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
#ifdef __linux__
- dlderr = dld_init("/proc/self/exe");
- if (dlderr) {
+ dlderr = dld_init("/proc/self/exe");
+ if (dlderr) {
#endif
- dlderr = dld_init(dld_find_executable(PL_origargv[0]));
- if (dlderr) {
- char *msg = dld_strerror(dlderr);
- SaveError(aTHX_ "dld_init(%s) failed: %s", PL_origargv[0], msg);
- DLDEBUG(1,PerlIO_printf(Perl_debug_log, "%s", LastError));
- }
+ dlderr = dld_init(dld_find_executable(PL_origargv[0]));
+ if (dlderr) {
+ char *msg = dld_strerror(dlderr);
+ SaveError(aTHX_ "dld_init(%s) failed: %s", PL_origargv[0], msg);
+ DLDEBUG(1,PerlIO_printf(Perl_debug_log, "%s", dl_last_error));
+ }
#ifdef __linux__
- }
+ }
#endif
+ }
}
PREINIT:
int dlderr,x,max;
GV *gv;
+ dMY_CXT;
CODE:
RETVAL = filename;
DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags));
char *
dl_error()
+ PREINIT:
+ dMY_CXT;
CODE:
- RETVAL = LastError ;
+ RETVAL = dl_last_error ;
OUTPUT:
RETVAL