diff src/dynamic-ld.cc @ 3321:6923abb04e16

[project @ 1999-10-26 18:15:30 by jwe]
author jwe
date Tue, 26 Oct 1999 18:15:41 +0000
parents dae85431bade
children 2efa28a91e7a
line wrap: on
line diff
--- a/src/dynamic-ld.cc	Fri Oct 22 09:46:23 1999 +0000
+++ b/src/dynamic-ld.cc	Tue Oct 26 18:15:41 1999 +0000
@@ -99,24 +99,39 @@
 
   void *handle = dlopen (file.c_str (), RTLD_LAZY);
 
-  const char *nm = name.c_str ();
+  string mangled_name = mangle_name (name);
+
+  const char *nm = mangled_name.c_str ();
 
   if (handle)
     {
-      void *tmp = dlsym (handle, nm);
+      // Try the installer function first.
+
+      string tmp_name = mangle_name ("octave_install_dld_functions");
 
-      retval = X_CAST (octave_dynamic_loader::builtin_fcn_installer, tmp);
+      const char *tmp_nm = tmp_name.c_str ();
 
+      void *tmp = dlsym (handle, tmp_nm);
+
+      retval = X_CAST (octave_dynamic_loader::builtin_fcn_installer,
+		       tmp);
       if (! retval)
 	{
-	  const char *errmsg = dlerror ();
+	  tmp = dlsym (handle, nm);
+
+	  retval = X_CAST (octave_dynamic_loader::builtin_fcn_installer, tmp);
+
+	  if (! retval)
+	    {
+	      const char *errmsg = dlerror ();
 
-	  if (errmsg)
-	    error("%s: `%s'", nm, errmsg);
-	  else
-	    error("unable to link function `%s'", nm);
+	      if (errmsg)
+		error("%s: `%s'", nm, errmsg);
+	      else
+		error("unable to link function `%s'", nm);
 
-	  dlclose (handle);
+	      dlclose (handle);
+	    }
 	}
     }
   else
@@ -162,25 +177,38 @@
 
   shl_t handle = shl_load (file.c_str (), BIND_DEFERRED, 0L);
 
-  const char *nm = name.c_str ();
+  string mangled_name = mangle_name (name);
+
+  const char *nm = mangled_name.c_str ();
 
   if (handle)
     {
+      // Try the installer function first.
+
+      string tmp_name = mangle_name ("octave_install_dld_functions");
+
+      const char *tmp_nm = tmp_name.c_str ();
+
       // Don't use TYPE_PROCEDURE here.  The man page says that future
       // versions of HP-UX may not support it.
 
-      int status = shl_findsym (&handle, nm, TYPE_UNDEFINED, &retval);
+      int status = shl_findsym (&handle, tmp_nm, TYPE_UNDEFINED, &retval);
 
       if (status < 0)
 	{
-	  const char *errmsg = strerror (errno);
+	  status = shl_findsym (&handle, nm, TYPE_UNDEFINED, &retval);
+
+	  if (status < 0)
+	    {
+	      const char *errmsg = strerror (errno);
 
-	  if (errmsg)
-	    error("%s: `%s'", nm, errmsg);
-	  else
-	    error("unable to link function `%s'", nm);
+	      if (errmsg)
+		error("%s: `%s'", nm, errmsg);
+	      else
+		error("unable to link function `%s'", nm);
 
-	  retval = 0;
+	      retval = 0;
+	    }
 	}
     }
   else
@@ -235,10 +263,8 @@
 
   if (! oct_file.empty ())
     {
-      string mangled_name = instance->mangle_name (fcn_name);
-
       builtin_fcn_installer f
-	= instance->resolve_reference (mangled_name, oct_file);
+	= instance->resolve_reference (fcn_name, oct_file);
 
       if (f)
 	retval = f ();