From: Gary V. Vaughan Date: Thu, 5 Apr 2001 22:05:49 +0000 (+0000) Subject: From Ahmed Masud X-Git-Tag: release-1-4~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1d08896a9559feb291827fcf142b812d192f0e96;p=thirdparty%2Flibtool.git From Ahmed Masud * 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. --- diff --git a/ChangeLog b/ChangeLog index fb1a4b1da..08bac8a90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2001-04-05 Gary V. Vaughan + From Ahmed Masud + * 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. diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c index 0855af3a4..072683798 100644 --- a/libltdl/ltdl.c +++ b/libltdl/ltdl.c @@ -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