libtool
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC][PATCH] add lt_dlopen_preloaded to the libltldl API


From: Kevin P. Fleming
Subject: [RFC][PATCH] add lt_dlopen_preloaded to the libltldl API
Date: Thu, 16 Oct 2003 12:32:12 -0700
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20030925

As was discussed earlier this week, I'd like to have a function that allows my
application to enumerate the modules that have been preloaded after lt_dlinit()
has been called. The patches below add a function called lt_dlopen_preloaded,
with no arguments, that just walks the preloaded symbols lists and lt_dlopen()
each modules it finds there. The handle returned from lt_dlopen() is not 
preserved,
but the handle is checked for errors and an aggregate error count is returned 
to the caller.

With this function in the API, the application can subsequently call 
lt_dlforeach
to enumerate all the modules (since they have now been opened), and do whatever
it likes with them.


--- ltdl.h.dist Thu Oct 16 12:23:29 2003
+++ ltdl.h      Thu Oct 16 11:25:50 2003
@@ -221,6 +221,7 @@
 extern int     lt_dlpreload    LT_PARAMS((const lt_dlsymlist *preloaded));
 extern int     lt_dlpreload_default
                                LT_PARAMS((const lt_dlsymlist *preloaded));
+extern  int     lt_dlopen_preloaded LT_PARAMS((void));

 #define LTDL_SET_PRELOADED_SYMBOLS()           LT_STMT_START{  \
        extern const lt_dlsymlist lt_preloaded_symbols[];               \
--- ltdl.c.dist Wed Oct 15 07:11:08 2003
+++ ltdl.c      Thu Oct 16 11:43:01 2003
@@ -2269,6 +2269,34 @@
 }

 int
+lt_dlopen_preloaded ()
+{
+  lt_dlsymlists_t     *list;
+  int                errors   = 0;
+  unsigned int        index;
+  const lt_dlsymlist *symbol;
+  lt_dlhandle         handle;
+
+  LT_DLMUTEX_LOCK ();
+
+  list = preloaded_symbols;
+  while (list)
+    {
+      for (index = 0; (symbol = &list->syms[index])->name != 0; index++) {
+       if ((symbol->address == 0) && strcmp(symbol->name, "@PROGRAM@"))
+         {
+       if ((handle = lt_dlopen(symbol->name)) == NULL)
+           errors++;
+         }
+      }
+      list = list->next;
+    }
+
+  LT_DLMUTEX_UNLOCK ();
+  return errors;
+}
+
+int
 lt_dlexit ()
 {
   /* shut down libltdl */






reply via email to

[Prev in Thread] Current Thread [Next in Thread]