2001-04-05 Gary V. Vaughan <gvv@techie.com>
+ From Ahmed Masud <masud@googgun.com>
+ * libltdl/ltdl.c (sys_shl_open): Return a NULL module handle
+ for self opening.
+ (sys_shl_close): Be careful not to close a NULL module handle.
+ (sys_shl_sym): Allow shl_findsym() to open NULL modules, but
+ discard the modified module address it returns.
+
* libltdl/ltdl.c (lt_dlopen): When reading the .la file,
reallocate the line buffer size if the line overflows the
original buffer.
{
lt_module module = shl_load (filename, LT_BIND_FLAGS, 0L);
- if (!module)
+ if (!filename)
{
- MUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
+ /* A NULL handle is used to get symbols from self and everything
+ else already loaded that was exported with -E compiler flag. */
+ module = (lt_module) 0;
}
+ else
+ {
+ module = shl_load (filename, LT_BIND_FLAGS, 0L);
+ if (!module)
+ {
+ MUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
+ }
+ }
+
return module;
}
{
int errors = 0;
- if (shl_unload ((shl_t) (module)) != 0)
+ if (module && (shl_unload ((shl_t) (module)) != 0))
{
MUTEX_SETERROR (LT_DLSTRERROR (CANNOT_CLOSE));
++errors;
lt_module module;
const char *symbol;
{
- lt_ptr address;
+ int is_module_self = (module == (lt_module) 0);
+ lt_ptr address = 0;
- if (module && shl_findsym ((shl_t*) &module,
- symbol, TYPE_UNDEFINED, &address) == 0)
+ /* shl_findsym considers zero valued MODULE as an indicator to saerch
+ for a symbol among all loaded (and exported) symbols including those
+ in the main executable. However, it sets MODULE to a valid module
+ address which breaks the semantics of libltdl's module management. */
+ if (shl_findsym ((shl_t*) &module, symbol, TYPE_UNDEFINED, &address) == 0)
{
- if (address)
+ if (!address)
{
- return address;
+ MUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
}
-
- MUTEX_SETERROR (LT_DLSTRERROR (SYMBOL_NOT_FOUND));
}
+
+ if (is_module_self)
+ module = (lt_module) 0;
- return 0;
+ return address;
}
static struct lt_user_dlloader sys_shl = {
char *dlname = 0, *old_name = 0;
char *libdir = 0, *deplibs = 0;
char *line;
+ size_t line_len;
int error = 0;
/* if we can't find the installed flag, it is probably an