diff --git a/ChangeLog b/ChangeLog index 57f2e3f1..795f87da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +1999-01-14 Thomas Tanner + + * libltdl/ltdl.c: added variable symbol prefix, added user-defined + library search path (can be set using lt_dlsearchpath()), + added default_preloaded_symbols which are independent of + lt_dlinit/exit + * libltdl/ltdl.h: added lt_dlsearchpath() and + lt_dlpreopen_default() + * mdemo/Makefile.am: use -export-dynamic until libtool + and libltdl are able to handle module dependencies + 1999-01-14 Gary V. Vaughan * ltconfig.in (PATH_SEPARATOR): new variable to hold valid $PATH @@ -16,18 +27,18 @@ the libtool scripts, build the libtool scripts in builddir, not srcdir (unfortunately this breaks building when srcdir!=objdir, - but it was just plain wrong - need's to be fixed), + but it was just plain wrong - needs to be fixed), build and install libltdl.tar.gz, copy acinclude.m4 instead of linking them, so that we can 'make dist' in libltdl, - fix configuring of subdirectories - * configure.in: remove --enable-ltdl-install - libltdl is supposed + fixed configuring of subdirectories + * configure.in: removed --enable-ltdl-install - libltdl is supposed to be installed by packages, not by libtool itself * libtoolize.in: new flags --ltdl and --ltdl-tar to install libltdl in packages (--ltdl doesn't work yet), install only the necessary libtool scripts, not just all files in pkgdatadir - * mdemo/Makefile.am: remove rule for libltdl configuration + * mdemo/Makefile.am: removed the rule for libltdl configuration 1999-01-13 Alexandre Oliva diff --git a/libltdl/ltdl.c b/libltdl/ltdl.c index e2142695..0e93215f 100644 --- a/libltdl/ltdl.c +++ b/libltdl/ltdl.c @@ -65,10 +65,12 @@ static const char *invalid_handle_error = "invalid handle"; static const char *buffer_overflow_error = "internal buffer overflow"; static const char *shutdown_error = "library already shutdown"; -static const char *last_error; +static const char *last_error = 0; +static const char *usr_search_path = 0; typedef struct lt_dltype_t { struct lt_dltype_t *next; + const char *sym_prefix; /* prefix for symbols */ int (*mod_init) __P((void)); int (*mod_exit) __P((void)); int (*lib_open) __P((lt_dlhandle handle, const char *filename)); @@ -250,8 +252,13 @@ dl_sym (handle, symbol) static lt_dltype_t -dl = { LT_DLTYPE_TOP, dl_init, dl_exit, +#ifdef NEED_USCORE +dl = { LT_DLTYPE_TOP, "_", dl_init, dl_exit, dl_open, dl_close, dl_sym }; +#else +dl = { LT_DLTYPE_TOP, 0, dl_init, dl_exit, + dl_open, dl_close, dl_sym }; +#endif #undef LT_DLTYPE_TOP #define LT_DLTYPE_TOP &dl @@ -354,7 +361,7 @@ shl_sym (handle, symbol) static lt_dltype_t -shl = { LT_DLTYPE_TOP, shl_init, shl_exit, +shl = { LT_DLTYPE_TOP, 0, shl_init, shl_exit, shl_open, shl_close, shl_sym }; #undef LT_DLTYPE_TOP @@ -422,7 +429,7 @@ dld_sym (handle, symbol) static lt_dltype_t -dld = { LT_DLTYPE_TOP, dld_init, dld_exit, +dld = { LT_DLTYPE_TOP, 0, dld_init, dld_exit, dld_open, dld_close, dld_sym }; #undef LT_DLTYPE_TOP @@ -486,7 +493,7 @@ wll_sym (handle, symbol) static lt_dltype_t -wll = { LT_DLTYPE_TOP, wll_init, wll_exit, +wll = { LT_DLTYPE_TOP, 0, wll_init, wll_exit, wll_open, wll_close, wll_sym }; #undef LT_DLTYPE_TOP @@ -503,13 +510,15 @@ typedef struct lt_dlsymlists_t { const lt_dlsymlist *syms; } lt_dlsymlists_t; +static const lt_dlsymlist *default_preloaded_symbols = 0; static lt_dlsymlists_t *preloaded_symbols = 0; static int presym_init () { - /* Don't nullify preloaded_symbols here, it would prevent one - from calling lt_dlpreload_default() before lt_dlinit() */ + preloaded_symbols = 0; + if (default_preloaded_symbols) + return lt_dlpreopen(default_preloaded_symbols); return 0; } @@ -530,8 +539,7 @@ presym_free_symlists () static int presym_exit () { - /* Don't reset preloaded_symbols here; adding/removing symbols - should be unrelated with init/exit */ + presym_free_symlists(); return 0; } @@ -613,10 +621,6 @@ presym_sym (handle, symbol) { lt_dlsymlist *syms = (lt_dlsymlist*)(handle->handle); -#if NEED_USCORE - /* lt_dlsym will have prepended a `_', but we don't need it */ - symbol++; -#endif syms++; while (syms->address) { if (syms->address && strcmp(syms->name, symbol) == 0) @@ -629,7 +633,7 @@ presym_sym (handle, symbol) static lt_dltype_t -presym = { LT_DLTYPE_TOP, presym_init, presym_exit, +presym = { LT_DLTYPE_TOP, 0, presym_init, presym_exit, presym_open, presym_close, presym_sym }; #undef LT_DLTYPE_TOP @@ -682,6 +686,8 @@ lt_dlpreopen (preloaded) return presym_add_symlist(preloaded); else { presym_free_symlists(); + if (default_preloaded_symbols) + return lt_dlpreopen(default_preloaded_symbols); return 0; } #else @@ -690,6 +696,19 @@ lt_dlpreopen (preloaded) #endif } +int +lt_dlpreopen_default (preloaded) + const lt_dlsymlist *preloaded; +{ +#if HAVE_DLPREOPEN + default_preloaded_symbols = preloaded; + return 0; +#else + last_error = dlpreopen_not_supported_error; + return 1; +#endif +} + int lt_dlexit () { @@ -831,9 +850,6 @@ find_library (handle, filename, have_dir, basename, search_path) char dir[FILENAME_MAX], fullname[FILENAME_MAX]; const char *p, *next; - if (tryall_dlopen(handle, filename) == 0) - return 0; - if (have_dir || !search_path) { last_error = file_not_found_error; return 1; @@ -894,10 +910,6 @@ find_file (filename, basename, have_dir, search_path) const char *p, *next; FILE *file; - file = fopen(filename, READTEXT_MODE); - if (file) - return file; - if (have_dir || !search_path) { last_error = file_not_found_error; return 0; @@ -965,7 +977,7 @@ lt_dlopen (filename) char dir[FILENAME_MAX]; const char *basename, *ext, *search_path; #ifdef LTDL_SHLIBPATH_VAR - const char *alt_search_path; + const char *sys_search_path; #endif const char *saved_error = last_error; @@ -982,7 +994,7 @@ lt_dlopen (filename) dir[basename - filename] = '\0'; search_path = getenv("LTDL_LIBRARY_PATH"); /* get the search path */ #ifdef LTDL_SHLIBPATH_VAR - alt_search_path = getenv(LTDL_SHLIBPATH_VAR); + sys_search_path = getenv(LTDL_SHLIBPATH_VAR); #endif /* check whether we open a libtool module (.la extension) */ ext = strrchr(basename, '.'); @@ -1012,11 +1024,17 @@ lt_dlopen (filename) last_error = memory_error; return 0; } - file = find_file(filename, *dir, basename, search_path); + file = fopen(filename, READTEXT_MODE); + if (!file) + file = find_file(filename, *dir, basename, + usr_search_path); + if (!file) + file = find_file(filename, *dir, basename, + search_path); #ifdef LTDL_SHLIBPATH_VAR if (!file) file = find_file(filename, *dir, basename, - alt_search_path); + sys_search_path); #endif if (!file) { free(name); @@ -1079,11 +1097,14 @@ lt_dlopen (filename) last_error = memory_error; return 0; } - if (find_library(&handle, filename, *dir, - basename, search_path) + if (tryall_dlopen(&handle, filename) + && find_library(&handle, filename, *dir, + basename, usr_search_path) + && find_library(&handle, filename, *dir, + basename, search_path) #ifdef LTDL_SHLIBPATH_VAR && find_library(&handle, filename, *dir, - basename, alt_search_path) + basename, sys_search_path) #endif ) { free(handle); @@ -1138,8 +1159,7 @@ lt_dlclose (handle) #define LT_SYMBOL_LENGTH 256 #undef LT_SYMBOL_OVERHEAD -/* This accounts for the initial underscore, the _LTX_ separator */ -/* and the string terminator */ +/* This accounts for the _LTX_ separator and the string terminator */ #define LT_SYMBOL_OVERHEAD 7 lt_ptr_t @@ -1147,7 +1167,7 @@ lt_dlsym (handle, symbol) lt_dlhandle handle; const char *symbol; { - int lensym, lenhand; + int lensym; char lsym[LT_SYMBOL_LENGTH]; char *sym; lt_ptr_t address; @@ -1161,27 +1181,25 @@ lt_dlsym (handle, symbol) return 0; } lensym = strlen(symbol); + if (handle->type->sym_prefix) + lensym += strlen(handle->type->sym_prefix); if (handle->name) - lenhand = strlen(handle->name); - else - lenhand = 0; - if (lensym + lenhand + LT_SYMBOL_OVERHEAD < LT_SYMBOL_LENGTH) + lensym += strlen(handle->name); + if (lensym + LT_SYMBOL_OVERHEAD < LT_SYMBOL_LENGTH) sym = lsym; else - sym = malloc(lensym + lenhand + LT_SYMBOL_OVERHEAD); + sym = malloc(lensym + LT_SYMBOL_OVERHEAD); if (!sym) { last_error = buffer_overflow_error; return 0; } if (handle->name) { /* this is a libtool module */ -#ifdef NEED_USCORE - /* prefix symbol with leading underscore */ - strcpy(sym, "_"); - strcat(sym, handle->name); -#else - strcpy(sym, handle->name); -#endif + if (handle->type->sym_prefix) { + strcpy(sym, handle->type->sym_prefix); + strcat(sym, handle->name); + } else + strcpy(sym, handle->name); strcat(sym, "_LTX_"); strcat(sym, symbol); /* try "modulename_LTX_symbol" */ @@ -1193,14 +1211,12 @@ lt_dlsym (handle, symbol) } } /* otherwise try "symbol" */ -#ifdef NEED_USCORE - /* prefix symbol with leading underscore */ - strcpy(sym, "_"); - strcat(sym, symbol); + if (handle->type->sym_prefix) { + strcpy(sym, handle->type->sym_prefix); + strcat(sym, handle->name); + } else + strcpy(sym, handle->name); address = handle->type->find_sym(handle, sym); -#else - address = handle->type->find_sym(handle, symbol); -#endif if (sym != lsym) free(sym); return address; @@ -1214,3 +1230,13 @@ lt_dlerror () last_error = 0; return error; } + +const char * +lt_dlsearchpath (search_path) + const char *search_path; +{ + const char *old_path = usr_search_path; + + usr_search_path = search_path; + return old_path; +} diff --git a/libltdl/ltdl.h b/libltdl/ltdl.h index 3bca1ce9..18ccbc8d 100644 --- a/libltdl/ltdl.h +++ b/libltdl/ltdl.h @@ -76,11 +76,13 @@ typedef struct { __BEGIN_DECLS _LTDLL_EXTERN int lt_dlinit __P((void)); _LTDLL_EXTERN int lt_dlpreopen __P((const lt_dlsymlist *preloaded)); +_LTDLL_EXTERN int lt_dlpreopen_default __P((const lt_dlsymlist *preloaded)); _LTDLL_EXTERN int lt_dlexit __P((void)); _LTDLL_EXTERN lt_dlhandle lt_dlopen __P((const char *filename)); _LTDLL_EXTERN int lt_dlclose __P((lt_dlhandle handle)); _LTDLL_EXTERN lt_ptr_t lt_dlsym __P((lt_dlhandle handle, const char *name)); _LTDLL_EXTERN const char *lt_dlerror __P((void)); +_LTDLL_EXTERN const char *lt_dlsearchpath __P((const char *search_path)); extern const lt_dlsymlist lt_preloaded_symbols[]; diff --git a/mdemo/Makefile.am b/mdemo/Makefile.am index 6d987588..14d63e11 100644 --- a/mdemo/Makefile.am +++ b/mdemo/Makefile.am @@ -25,11 +25,15 @@ bin_PROGRAMS = mdemo mdemo.debug # Create a version of mdemo that does dlopen. mdemo_SOURCES = main.c mdemo_LDADD = ../libltdl/libltdlc.la -mdemo_LDFLAGS = -dlopen foo1.la -dlopen libfoo2.la +mdemo_LDFLAGS = -dlopen foo1.la -dlopen libfoo2.la \ + -export-dynamic # FIXME: remove this when libtool and libltdl \ + # handle dependencies of modules mdemo_DEPENDENCIES = ../libltdl/libltdlc.la foo1.la libfoo2.la # Create an easier-to-debug version of mdemo. mdemo_debug_SOURCES = main.c mdemo_debug_LDADD = ../libltdl/libltdlc.la -mdemo_debug_LDFLAGS = -static -dlopen foo1.la -dlopen libfoo2.la +mdemo_debug_LDFLAGS = -static -dlopen foo1.la -dlopen libfoo2.la \ + -export-dynamic # FIXME: remove this when libtool and libltdl \ + # handle dependencies of modules mdemo_debug_DEPENDENCIES = ../libltdl/libltdlc.la foo1.la libfoo2.la