Browse Source

Doh! I was returning with an incorrect pointer type when dlopening
already loaded libs, which unsurprisingly would cause dlsym() to
not work at all...
-Erik

Eric Andersen 20 years ago
parent
commit
5f7b130ef0
2 changed files with 14 additions and 14 deletions
  1. 7 7
      ldso/libdl/dlib.c
  2. 7 7
      ldso/libdl/libdl.c

+ 7 - 7
ldso/libdl/dlib.c

@@ -186,13 +186,6 @@ void *_dlopen(const char *libname, int flag)
 		_dl_unmap_cache();
 		return NULL;
 	}
-	if (tpnt->init_flag & INIT_FUNCS_CALLED) {
-
-	    /* If the init and fini stuff has already been run, that means
-	     * someone called dlopen on a library we already have opened, so
-	     * we don't need to fix thing up any further... */
-	    return tpnt;
-	}
 
 	dyn_chain = (struct dyn_elf *) malloc(sizeof(struct dyn_elf));
 	_dl_memset(dyn_chain, 0, sizeof(struct dyn_elf));
@@ -204,6 +197,13 @@ void *_dlopen(const char *libname, int flag)
 	dyn_chain->next_handle = _dl_handles;
 	_dl_handles = rpnt = dyn_chain;
 
+	if (tpnt->init_flag & INIT_FUNCS_CALLED) {
+	    /* If the init and fini stuff has already been run, that means
+	     * the dlopen'd library has already been loaded, and nothing
+	     * further needs to be done. */
+	    return (void *) dyn_chain;
+	}
+
 
 #ifdef __SUPPORT_LD_DEBUG__
 	if(_dl_debug) 

+ 7 - 7
ldso/libdl/libdl.c

@@ -186,13 +186,6 @@ void *_dlopen(const char *libname, int flag)
 		_dl_unmap_cache();
 		return NULL;
 	}
-	if (tpnt->init_flag & INIT_FUNCS_CALLED) {
-
-	    /* If the init and fini stuff has already been run, that means
-	     * someone called dlopen on a library we already have opened, so
-	     * we don't need to fix thing up any further... */
-	    return tpnt;
-	}
 
 	dyn_chain = (struct dyn_elf *) malloc(sizeof(struct dyn_elf));
 	_dl_memset(dyn_chain, 0, sizeof(struct dyn_elf));
@@ -204,6 +197,13 @@ void *_dlopen(const char *libname, int flag)
 	dyn_chain->next_handle = _dl_handles;
 	_dl_handles = rpnt = dyn_chain;
 
+	if (tpnt->init_flag & INIT_FUNCS_CALLED) {
+	    /* If the init and fini stuff has already been run, that means
+	     * the dlopen'd library has already been loaded, and nothing
+	     * further needs to be done. */
+	    return (void *) dyn_chain;
+	}
+
 
 #ifdef __SUPPORT_LD_DEBUG__
 	if(_dl_debug)