aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-08-12 12:54:56 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:50 +1000
commit75af5a8f20800977aabfd95fdfc403f851f8c459 (patch)
tree55f9391a0999f9ecaf1cf90ba0ea359c0e66c68f
parent3d5db752ffeaf40e616198872083b3a00eadc36b (diff)
downloadjimtcl-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.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/jim-load.c b/jim-load.c
index 84a7d43..4dffb82 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -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);