mirror of
git://git.savannah.gnu.org/libtool.git
synced 2024-11-27 06:09:57 +08:00
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.
This commit is contained in:
parent
da8bfb3dee
commit
1d08896a95
@ -1,5 +1,12 @@
|
||||
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.
|
||||
|
@ -687,13 +687,20 @@ sys_shl_open (loader_data, filename)
|
||||
lt_user_data loader_data;
|
||||
const char *filename;
|
||||
{
|
||||
lt_module module = shl_load (filename, LT_BIND_FLAGS, 0L);
|
||||
/* A NULL handle is used to get symbols from self and everything
|
||||
else already loaded that was exported with -E compiler flag. */
|
||||
lt_module module (lt_module) 0;
|
||||
|
||||
if (!module)
|
||||
if (filename)
|
||||
{
|
||||
MUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
|
||||
}
|
||||
module = shl_load (filename, LT_BIND_FLAGS, 0L);
|
||||
|
||||
if (!module)
|
||||
{
|
||||
MUTEX_SETERROR (LT_DLSTRERROR (CANNOT_OPEN));
|
||||
}
|
||||
}
|
||||
|
||||
return module;
|
||||
}
|
||||
|
||||
@ -704,7 +711,7 @@ sys_shl_close (loader_data, 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;
|
||||
@ -719,20 +726,25 @@ sys_shl_sym (loader_data, module, symbol)
|
||||
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 search
|
||||
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 = {
|
||||
@ -2048,6 +2060,7 @@ lt_dlopen (filename)
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user