+2000-05-11 Thomas Tanner <tanner@ffii.org>
+
+ * NEWS: update
+ * doc/libtool.texi (libltdl): rename lt_(find|next|add|remove)_dlloader
+ to lt_dlloader_*
+ * libltdl/ltdl.c: ditto
+ * libltdl/ltdl.h: ditto, add declaration of lt_dlloader_(find|remove)
+
2000-05-06 Pavel Roskin <pavel_roskin@geocities.com>
* libltdl/ltdl.c: Typo.
* Libtool now allows you to link shared libraries against static code.
* New functions in libltdl:
lt_dlgetinfo, lt_dlforeach provide access to module specific data in handles.
- lt_next_dlloader, lt_dlloader_name, lt_find_dlloader and
- lt_add_dlloader can be used for adding new types of module loaders.
+ lt_dlloader_next, lt_dlloader_name, lt_dlloader_find, lt_dlloader_add and
+ lt_dlloader_remove can be used for adding new types of module loaders.
lt_dladderror, lt_dlseterror integrate user module loaders with lt_dlerror.
* "-Xcompiler" and "-Wc," does now work in compile mode, too.
* Start of support code for cross-compiling to win32.
and registered.
Registering the loader requires that you choose a name for it, so that it
-can be recognised by @code{lt_find_dlloader} and removed with
-@code{lt_remove_dlloader}. The name you choose must be unique, and not
+can be recognised by @code{lt_dlloader_find} and removed with
+@code{lt_dlloader_remove}. The name you choose must be unique, and not
already in use by libltdl's builtin loaders:
@table @asis
@deftypefn {Type} {struct} lt_user_dlloader @{@w{const char *@var{sym_prefix};} @w{lt_module_open_t *@var{module_open};}@w{lt_module_close_t *@var{module_close};} @w{lt_find_sym_t *@var{find_sym};} @w{lt_dlloader_exit_t *@var{dlloader_exit};} @w{lt_dlloader_data_t @var{dlloader_data};} @}
If you want to define a new way to open dynamic modules, and have the
@code{lt_dlopen} @sc{api} use it, you need to instantiate one of these
-structures and pass it to @code{lt_add_dlloader}. You can pass whatever
+structures and pass it to @code{lt_dlloader_add}. You can pass whatever
you like in the @var{dlloader_data} field, and it will be passed back as
the value of the first parameter to each of the functions specified in
the function pointer fields.
with the loader, including any user specified data in the
@code{dlloader_data} field of the @code{lt_user_dlloader}. If non-@code{NULL},
the function will be called by @code{lt_dlexit}, and
-@code{lt_remove_dlloader}.
+@code{lt_dlloader_remove}.
@end deftypefn
For example:
dlloader.dlloader_data = (lt_dlloader_data_t)myloader_function;
/* Add my loader as the default module loader. */
- if (lt_add_dlloader (lt_next_dlloader (NULL), &dlloader, "myloader") != 0)
+ if (lt_dlloader_add (lt_dlloader_next (NULL), &dlloader, "myloader") != 0)
return ERROR;
return OK;
libltdl provides the following functions for writing your own module
loaders:
-@deftypefun int lt_add_dlloader (@w{lt_dlloader_t *@var{place},} @w{lt_user_dlloader *@var{dlloader},} @w{const char *@var{loader_name}})
+@deftypefun int lt_dlloader_add (@w{lt_dlloader_t *@var{place},} @w{lt_user_dlloader *@var{dlloader},} @w{const char *@var{loader_name}})
Add a new module loader to the list of all loaders, either as the
last loader (if @var{place} is @code{NULL}), else immediately before the
loader passed as @var{place}. @var{loader_name} will be returned by
@code{lt_dlloader_name} if it is subsequently passed a newly
registered loader. These @var{loader_name}s must be unique, or
-@code{lt_remove_dlloader} and @code{lt_find_dlloader} cannot
+@code{lt_dlloader_remove} and @code{lt_dlloader_find} cannot
work. Returns 0 for success.
@example
@{
/* Make myloader be the last one. */
- if (lt_add_dlloader (NULL, myloader) != 0)
+ if (lt_dlloader_add (NULL, myloader) != 0)
perror (lt_dlerror ());
@}
@end example
@end deftypefun
-@deftypefun int lt_remove_dlloader (@w{const char *@var{loader_name}})
+@deftypefun int lt_dlloader_remove (@w{const char *@var{loader_name}})
Remove the loader identified by the unique name, @var{loader_name}.
Before this can succeed, all modules opened by the named loader must
have been closed. Returns 0 for success, otherwise an error message can
@example
@{
/* Remove myloader. */
- if (lt_remove_dlloader ("myloader") != 0)
+ if (lt_dlloader_remove ("myloader") != 0)
perror (lt_dlerror ());
@}
@end example
@end deftypefun
-@deftypefun {lt_dlloader_t *}lt_next_dlloader (@w{lt_dlloader_t *@var{place}})
+@deftypefun {lt_dlloader_t *}lt_dlloader_next (@w{lt_dlloader_t *@var{place}})
Iterate over the module loaders, returning the first loader if @var{place} is
@code{NULL}, and the next one on subsequent calls. The handle is for use with
-@code{lt_add_dlloader}.
+@code{lt_dlloader_add}.
@example
@{
/* Make myloader be the first one. */
- if (lt_add_dlloader (lt_next_dlloader (NULL), myloader) != 0)
+ if (lt_dlloader_add (lt_dlloader_next (NULL), myloader) != 0)
return ERROR;
@}
@end example
@end deftypefun
-@deftypefun {lt_dlloader_t *}lt_find_dlloader (@w{const char *@var{loader_name}})
+@deftypefun {lt_dlloader_t *}lt_dlloader_find (@w{const char *@var{loader_name}})
Return the first loader with a matching @var{loader_name} identifier, or else
@code{NULL}, if the identifier is not found.
@{
/* Add a user loader as the next module loader to be tried if
the standard dlopen loader were to fail when lt_dlopening. */
- if (lt_add_dlloader (lt_find_dlloader ("dlopen"), myloader) != 0)
+ if (lt_dlloader_add (lt_dlloader_find ("dlopen"), myloader) != 0)
return ERROR;
@}
@end example
@deftypefun {const char *}lt_dlloader_name (@w{lt_dlloader_t *@var{place}})
Return the identifying name of @var{PLACE}, as obtained from
-@code{lt_next_dlloader} or @code{lt_find_dlloader}. If this function fails,
+@code{lt_dlloader_next} or @code{lt_dlloader_find}. If this function fails,
it will return @code{NULL} and set an error for retrieval with
@code{lt_dlerror}.
@end deftypefun
@deftypefun {lt_dlloader_data_t *}lt_dlloader_data (@w{lt_dlloader_t *@var{place}})
Return the address of the @code{dlloader_data} of @var{PLACE}, as
-obtained from @code{lt_next_dlloader} or @code{lt_find_dlloader}. If
+obtained from @code{lt_dlloader_next} or @code{lt_dlloader_find}. If
this function fails, it will return @code{NULL} and set an error for
retrieval with @code{lt_dlerror}.
@end deftypefun
# endif
#endif
-/*ARGSUSED*/
static lt_module_t
sys_dl_open (loader_data, filename)
lt_dlloader_data_t loader_data;
return module;
}
-/*ARGSUSED*/
static int
sys_dl_close (loader_data, module)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_ptr_t
sys_dl_sym (loader_data, module, symbol)
lt_dlloader_data_t loader_data;
#define LTDL_BIND_FLAGS (BIND_IMMEDIATE | BIND_NONFATAL | DYNAMIC_PATH)
-/*ARGSUSED*/
static lt_module_t
sys_shl_open (loader_data, filename)
lt_dlloader_data_t loader_data;
return module;
}
-/*ARGSUSED*/
static int
sys_shl_close (loader_data, module)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_ptr_t
sys_shl_sym (loader_data, module, symbol)
lt_dlloader_data_t loader_data;
/* Forward declaration; required to implement handle search below. */
static lt_dlhandle handles;
-/*ARGSUSED*/
static lt_module_t
sys_wll_open (loader_data, filename)
lt_dlloader_data_t loader_data;
return module;
}
-/*ARGSUSED*/
static int
sys_wll_close (loader_data, module)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_ptr_t
sys_wll_sym (loader_data, module, symbol)
lt_dlloader_data_t loader_data;
#include <kernel/image.h>
-/*ARGSUSED*/
static lt_module_t
sys_bedl_open (loader_data, filename)
lt_dlloader_data_t loader_data;
return (lt_module_t) image;
}
-/*ARGSUSED*/
static int
sys_bedl_close (loader_data, module)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_ptr_t
sys_bedl_sym (loader_data, module, symbol)
lt_dlloader_data_t loader_data;
#include <dld.h>
#endif
-/*ARGSUSED*/
static lt_module_t
sys_dld_open (loader_data, filename)
lt_dlloader_data_t loader_data;
return module;
}
-/*ARGSUSED*/
static int
sys_dld_close (loader_data, module)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_ptr_t
sys_dld_sym (loader_data, module, symbol)
lt_dlloader_data_t loader_data;
static const lt_dlsymlist *default_preloaded_symbols = 0;
static lt_dlsymlists_t *preloaded_symbols = 0;
-/*ARGSUSED*/
static int
presym_init (loader_data)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static int
presym_exit (loader_data)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_module_t
presym_open (loader_data, filename)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static int
presym_close (loader_data, module)
lt_dlloader_data_t loader_data;
return 0;
}
-/*ARGSUSED*/
static lt_ptr_t
presym_sym (loader_data, module, symbol)
lt_dlloader_data_t loader_data;
user_search_path = 0; /* empty search path */
#if HAVE_LIBDL && !defined(__CYGWIN__)
- errors += lt_add_dlloader (lt_next_dlloader(0), &sys_dl, "dlopen");
+ errors += lt_dlloader_add (lt_dlloader_next(0), &sys_dl, "dlopen");
#endif
#if HAVE_SHL_LOAD
- errors += lt_add_dlloader (lt_next_dlloader(0), &sys_shl, "dlopen");
+ errors += lt_dlloader_add (lt_dlloader_next(0), &sys_shl, "dlopen");
#endif
#ifdef _WIN32
- errors += lt_add_dlloader (lt_next_dlloader(0), &sys_wll, "dlopen");
+ errors += lt_dlloader_add (lt_dlloader_next(0), &sys_wll, "dlopen");
#endif
#ifdef __BEOS__
- errors += lt_add_dlloader (lt_next_dlloader(0), &sys_bedl, "dlopen");
+ errors += lt_dlloader_add (lt_dlloader_next(0), &sys_bedl, "dlopen");
#endif
#if HAVE_DLD
- errors += lt_add_dlloader (lt_next_dlloader(0), &sys_dld, "dld");
+ errors += lt_dlloader_add (lt_dlloader_next(0), &sys_dld, "dld");
#endif
- errors += lt_add_dlloader (lt_next_dlloader(0), &presym, "dlpreload");
+ errors += lt_dlloader_add (lt_dlloader_next(0), &presym, "dlpreload");
if (presym_init(presym.dlloader_data)) {
last_error = LT_DLSTRERROR(INIT_LOADER);
return 1;
return 0;
}
-\f
int
-lt_add_dlloader (place, dlloader, loader_name)
+lt_dlloader_add (place, dlloader, loader_name)
lt_dlloader_t *place;
const struct lt_user_dlloader *dlloader;
const char *loader_name;
}
int
-lt_remove_dlloader (loader_name)
+lt_dlloader_remove (loader_name)
const char *loader_name;
{
- lt_dlloader_t *place = lt_find_dlloader (loader_name);
+ lt_dlloader_t *place = lt_dlloader_find (loader_name);
lt_dlhandle handle;
int result = 0;
}
lt_dlloader_t *
-lt_next_dlloader (place)
+lt_dlloader_next (place)
lt_dlloader_t *place;
{
return place ? place->next : loaders;
}
lt_dlloader_t *
-lt_find_dlloader (loader_name)
+lt_dlloader_find (loader_name)
const char *loader_name;
{
lt_dlloader_t *place = 0;
return place;
}
-\f
static const char **user_error_strings = 0;
static int errorcode = LTDL_ERROR_MAX;
#include <stdlib.h>
-\f
/* Defining error strings alongside their symbolic names in a macro in
this way allows us to expand the macro in different contexts with
confidence that the enumeration of symbolic names will map correctly
};
#undef LTDL_ERROR
-\f
/* An opaque handle for a successfully lt_dlopened module instance. */
#ifdef _LTDL_COMPILE_
typedef struct lt_dlhandle_t *lt_dlhandle;
extern int lt_dlforeach LTDL_PARAMS((
int (*func)(lt_dlhandle handle, lt_ptr_t data), lt_ptr_t data));
-\f
/* User module loader API. */
struct lt_user_dlloader {
const char *sym_prefix;
lt_dlloader_data_t dlloader_data;
};
-extern lt_dlloader_t *lt_next_dlloader LTDL_PARAMS((lt_dlloader_t *place));
+extern lt_dlloader_t *lt_dlloader_next LTDL_PARAMS((lt_dlloader_t *place));
+extern lt_dlloader_t *lt_dlloader_find LTDL_PARAMS((const char *loader_name));
extern const char *lt_dlloader_name LTDL_PARAMS((lt_dlloader_t *place));
extern lt_dlloader_data_t *lt_dlloader_data LTDL_PARAMS((lt_dlloader_t *place));
extern lt_dlloader_t *lt_find_dlloader LTDL_PARAMS((const char *loader_name));
-extern int lt_add_dlloader LTDL_PARAMS((lt_dlloader_t *place, const struct lt_user_dlloader *dlloader, const char *loader_name));
+extern int lt_dlloader_add LTDL_PARAMS((lt_dlloader_t *place, const struct lt_user_dlloader *dlloader, const char *loader_name));
+extern int lt_dlloader_remove LTDL_PARAMS((const char *loader_name));
/* Integrated lt_dlerror() messages for user loaders. */
extern int lt_dladderror LTDL_PARAMS((const char *diagnostic));