diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-08-12 12:54:56 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-10-15 11:02:50 +1000 |
commit | 75af5a8f20800977aabfd95fdfc403f851f8c459 (patch) | |
tree | 55f9391a0999f9ecaf1cf90ba0ea359c0e66c68f | |
parent | 3d5db752ffeaf40e616198872083b3a00eadc36b (diff) | |
download | jimtcl-75af5a8f20800977aabfd95fdfc403f851f8c459.zip jimtcl-75af5a8f20800977aabfd95fdfc403f851f8c459.tar.gz jimtcl-75af5a8f20800977aabfd95fdfc403f851f8c459.tar.bz2 |
Fix dynamic loading of extensions
In order to accomodate both static and dynamic extensions,
a unique init function is used for each extension.
Take this into account when loading.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-load.c | 35 |
1 files changed, 31 insertions, 4 deletions
@@ -61,10 +61,37 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName) continue; goto err; } - if ((onload = dlsym(handle, "Jim_OnLoad")) == NULL) { - Jim_SetResultString(interp, - "No Jim_OnLoad symbol found on extension", -1); - goto err; + + /* Now, we use a unique init symbol depending on the extension name. + * This is done for compatibility between static and dynamic extensions. + * For extension readline.so, the init symbol is "Jim_readlineInit" + */ + { + const char *pt; + const char *pkgname; + int pkgnamelen; + char initsym[50]; + + pt = strrchr(pathName, '/'); + if (pt) { + pkgname = pt + 1; + } else { + pkgname = pathName; + } + pt = strchr(pkgname, '.'); + if (pt) { + pkgnamelen = pt - pkgname; + } + else { + pkgnamelen = strlen(pkgname); + } + snprintf(initsym, sizeof(initsym), "Jim_%.*sInit", pkgnamelen, pkgname); + + if ((onload = dlsym(handle, initsym)) == NULL) { + Jim_SetResultFormatted(interp, + "No %s symbol found in extension %s", initsym, pathName); + goto err; + } } if (onload(interp) == JIM_ERR) { dlclose(handle); |