enhanced the dynamic library loader a bit

This commit is contained in:
hyunghwan.chung 2017-02-04 05:30:15 +00:00
parent 54a2128713
commit 98b6dd1118
4 changed files with 54 additions and 40 deletions

View File

@ -8,7 +8,7 @@ ASSUME CS:PROG_CODE
PUBLIC _halt_cpu PUBLIC _halt_cpu
_halt_cpu PROC NEAR _halt_cpu PROC NEAR
; HLT ; this will cause #GP(0) as it's privileged. TODO: find a way to raise privilege level. ;HLT ; this will cause #GP(0) as CPL is set to 3 by intel dos extender.
;MOV AX, CS ;MOV AX, CS
;AND AX, 3 ;AND AX, 3
RET RET

View File

@ -5,7 +5,8 @@
# /zmod486 - 80486 instructions # /zmod486 - 80486 instructions
# /zfloatsync - FPU is operand-synchronized with the CPU # /zfloatsync - FPU is operand-synchronized with the CPU
# /m create map file # /m create map file
CFLAGS := /D__DOS__ /DMOO_ENABLE_STATIC_MODULE /DNDEBUG /g /zmod486 /m # /g produce debug info
CFLAGS := /D__DOS__ /DMOO_ENABLE_STATIC_MODULE /DNDEBUG
LDFLAGS := /xnovm /xregion=12m LDFLAGS := /xnovm /xregion=12m
SRCS := \ SRCS := \

View File

@ -307,86 +307,99 @@ static moo_ooi_t input_handler (moo_t* moo, moo_iocmd_t cmd, moo_ioarg_t* arg)
static void* dl_open (moo_t* moo, const moo_ooch_t* name, int flags) static void* dl_open (moo_t* moo, const moo_ooch_t* name, int flags)
{ {
#if defined(USE_LTDL) #if defined(USE_LTDL)
/* TODO: support various platforms */ moo_bch_t stbuf[128];
moo_bch_t buf[1024]; /* TODO: use a proper path buffer */ moo_bch_t* bufptr;
moo_oow_t ucslen, bcslen; moo_oow_t ucslen, bcslen, bufcapa;
void* handle; void* handle;
if (moo_convootobcstr (moo, name, &ucslen, MOO_NULL, &bufcapa) <= -1) return MOO_NULL;
/* +1 for terminating null. but it's not needed because MOO_COUNTOF(MOO_DEFAULT_PFMODPREFIX)
* and MOO_COUNTOF(MOO_DEFAULT_PFMODPOSTIFX) include the terminating nulls. Never mind about
* the extra 2 characters. */
bufcapa += MOO_COUNTOF(MOO_DEFAULT_PFMODPREFIX) + MOO_COUNTOF(MOO_DEFAULT_PFMODPOSTFIX) + 1;
if (bufcapa <= MOO_COUNTOF(stbuf)) bufptr = stbuf;
else
{
bufptr = moo_allocmem (moo, bufcapa * MOO_SIZEOF(*bufptr));
if (!bufptr) return MOO_NULL;
}
if (flags & MOO_VMPRIM_OPENDL_PFMOD) if (flags & MOO_VMPRIM_OPENDL_PFMOD)
{ {
moo_oow_t len; moo_oow_t len;
/* opening a primitive function module */ /* opening a primitive function module */
len = moo_copybcstr (buf, MOO_COUNTOF(buf), MOO_DEFAULT_PFMODPREFIX); len = moo_copybcstr (bufptr, bufcapa, MOO_DEFAULT_PFMODPREFIX);
bcslen = MOO_COUNTOF(buf) - len; bcslen = bufcapa - len;
#if defined(MOO_OOCH_IS_UCH) #if defined(MOO_OOCH_IS_UCH)
if (moo_convootobcstr (moo, name, &ucslen, &buf[len], &bcslen) <= -1) return MOO_NULL; moo_convootobcstr (moo, name, &ucslen, &bufptr[len], &bcslen);
#else #else
bcslen = moo_copybcstr (&buf[len], bcslen, name); bcslen = moo_copybcstr (&bufptr[len], bcslen, name);
#endif #endif
moo_copybcstr (&buf[bcslen + len], MOO_COUNTOF(buf) - bcslen - len, MOO_DEFAULT_PFMODPOSTFIX); moo_copybcstr (&bufptr[bcslen + len], bufcapa - bcslen - len, MOO_DEFAULT_PFMODPOSTFIX);
handle = lt_dlopenext (buf); handle = lt_dlopenext (bufptr);
if (!handle) if (!handle)
{ {
MOO_DEBUG3 (moo, "Failed to open(ext) DL %hs[%js] - %hs\n", buf, name, lt_dlerror()); MOO_DEBUG3 (moo, "Failed to open(ext) DL %hs[%js] - %hs\n", bufptr, name, lt_dlerror());
buf[bcslen + len] = '\0'; bufptr[bcslen + len] = '\0';
handle = lt_dlopenext (&buf[len]); handle = lt_dlopenext (&bufptr[len]);
if (!handle) MOO_DEBUG3 (moo, "Failed to open(ext) DL %hs[%js] - %s\n", &buf[len], name, lt_dlerror()); if (!handle) MOO_DEBUG3 (moo, "Failed to open(ext) DL %hs[%js] - %s\n", &bufptr[len], name, lt_dlerror());
else MOO_DEBUG3 (moo, "Opened(ext) DL %hs[%js] handle %p\n", &buf[len], name, handle); else MOO_DEBUG3 (moo, "Opened(ext) DL %hs[%js] handle %p\n", &bufptr[len], name, handle);
} }
else else
{ {
MOO_DEBUG3 (moo, "Opened(ext) DL %hs[%js] handle %p\n", buf, name, handle); MOO_DEBUG3 (moo, "Opened(ext) DL %hs[%js] handle %p\n", bufptr, name, handle);
} }
} }
else else
{ {
/* opening a raw shared object */ /* opening a raw shared object without a prefix and/or a postfix */
#if defined(MOO_OOCH_IS_UCH) #if defined(MOO_OOCH_IS_UCH)
bcslen = MOO_COUNTOF(buf); bcslen = bufcapa;
if (moo_convootobcstr (moo, name, &ucslen, buf, &bcslen) <= -1) return MOO_NULL; moo_convootobcstr (moo, name, &ucslen, bufptr, &bcslen);
#else #else
bcslen = moo_copybcstr (buf, MOO_COUNTOF(buf), name); bcslen = moo_copybcstr (bufptr, bufcapa, name);
#endif #endif
if (moo_findbchar (buf, bcslen, '.')) if (moo_findbchar (bufptr, bcslen, '.'))
{ {
handle = lt_dlopen (buf); handle = lt_dlopen (bufptr);
if (!handle) MOO_DEBUG2 (moo, "Failed to open DL %hs - %s\n", buf, lt_dlerror()); if (!handle) MOO_DEBUG2 (moo, "Failed to open DL %hs - %s\n", bufptr, lt_dlerror());
else MOO_DEBUG2 (moo, "Opened DL %hs handle %p\n", buf, handle); else MOO_DEBUG2 (moo, "Opened DL %hs handle %p\n", bufptr, handle);
} }
else else
{ {
handle = lt_dlopenext (buf); handle = lt_dlopenext (bufptr);
if (!handle) MOO_DEBUG2 (moo, "Failed to open(ext) DL %hs - %s\n", buf, lt_dlerror()); if (!handle) MOO_DEBUG2 (moo, "Failed to open(ext) DL %hs - %s\n", bufptr, lt_dlerror());
else MOO_DEBUG2 (moo, "Opened(ext) DL %hs handle %p\n", buf, handle); else MOO_DEBUG2 (moo, "Opened(ext) DL %hs handle %p\n", bufptr, handle);
} }
} }
if (bufptr != stbuf) moo_freemem (moo, bufptr);
return handle; return handle;
#else #else
/* TODO: support various platforms */
/* TODO: implemenent this */ /* TODO: implemenent this */
MOO_DEBUG1 (moo, "Dynamic loading not implemented - cannot open %js\n", name);
moo_seterrnum (moo, MOO_ENOIMPL);
return MOO_NULL; return MOO_NULL;
#endif #endif
} }
static void dl_close (moo_t* moo, void* handle) static void dl_close (moo_t* moo, void* handle)
{ {
MOO_DEBUG1 (moo, "Closed DL handle %p\n", handle);
#if defined(USE_LTDL) #if defined(USE_LTDL)
MOO_DEBUG1 (moo, "Closed DL handle %p\n", handle);
lt_dlclose (handle); lt_dlclose (handle);
#elif defined(_WIN32)
FreeLibrary ((HMODULE)handle);
#elif defined(__OS2__)
DosFreeModule ((HMODULE)handle);
#elif defined(__DOS__) && defined(QSE_ENABLE_DOS_DYNAMIC_MODULE)
FreeModule (handle);
#else #else
/* nothing to do */ /* TODO: implemenent this */
MOO_DEBUG1 (moo, "Dynamic loading not implemented - cannot close handle %p\n", handle);
#endif #endif
} }
@ -402,7 +415,7 @@ static void* dl_getsym (moo_t* moo, void* handle, const moo_ooch_t* name)
bcslen = MOO_COUNTOF(buf) - 2; bcslen = MOO_COUNTOF(buf) - 2;
#if defined(MOO_OOCH_IS_UCH) #if defined(MOO_OOCH_IS_UCH)
moo_convootobcstr (moo, name, &ucslen, &buf[1], &bcslen); /* TODO: error check */ if (moo_convootobcstr (moo, name, &ucslen, &buf[1], &bcslen) <= -1) return MOO_NULL;
#else #else
bcslen = moo_copybcstr (&buf[1], bcslen, name); bcslen = moo_copybcstr (&buf[1], bcslen, name);
#endif #endif
@ -431,7 +444,7 @@ static void* dl_getsym (moo_t* moo, void* handle, const moo_ooch_t* name)
return sym; return sym;
#else #else
/* TODO: IMPLEMENT THIS */ /* TODO: IMPLEMENT THIS */
MOO_DEBUG2 (moo, "Dynamic loading not implemented - Cannot loaded module symbol %s from handle %p\n", symname, handle); MOO_DEBUG2 (moo, "Dynamic loading not implemented - Cannot load module %js from handle %p\n", name, handle);
moo_seterrnum (moo, MOO_ENOIMPL); moo_seterrnum (moo, MOO_ENOIMPL);
return MOO_NULL; return MOO_NULL;
#endif #endif

View File

@ -345,7 +345,7 @@ void moo_freemem (moo_t* moo, void* ptr)
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
#define MOD_PREFIX "moo_mod_" #define MOD_PREFIX "moo_mod_"
#define MOD_PREFIX_LEN 9 #define MOD_PREFIX_LEN 8
#if defined(MOO_ENABLE_STATIC_MODULE) #if defined(MOO_ENABLE_STATIC_MODULE)
@ -485,7 +485,7 @@ moo_mod_data_t* moo_openmod (moo_t* moo, const moo_ooch_t* name, moo_oow_t namel
if (load (moo, &mdp->mod) <= -1) if (load (moo, &mdp->mod) <= -1)
{ {
MOO_DEBUG3 (moo, "Module function [%js] returned failure in [%.*js]\n", buf, namelen, name); MOO_DEBUG3 (moo, "Module function [%js] returned failure in [%.*js]\n", buf, namelen, name);
moo->errnum = MOO_ENOENT; /* TODO: proper error code and handling */ moo->errnum = MOO_ENOENT; /* TODO: proper/better error code and handling */
moo_rbt_delete (&moo->modtab, name, namelen); moo_rbt_delete (&moo->modtab, name, namelen);
moo->vmprim.dl_close (moo, mdp->handle); moo->vmprim.dl_close (moo, mdp->handle);
return MOO_NULL; return MOO_NULL;