mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			251 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
| /* ltdl.h -- generic dlopen functions
 | |
|    Copyright (C) 1998-2000 Free Software Foundation, Inc.
 | |
|    Originally by Thomas Tanner <tanner@ffii.org>
 | |
|    This file is part of GNU Libtool.
 | |
| 
 | |
| This library is free software; you can redistribute it and/or
 | |
| modify it under the terms of the GNU Lesser General Public
 | |
| License as published by the Free Software Foundation; either
 | |
| version 2 of the License, or (at your option) any later version.
 | |
| 
 | |
| As a special exception to the GNU Lesser General Public License,
 | |
| if you distribute this file as part of a program or library that
 | |
| is built using GNU libtool, you may include it under the same
 | |
| distribution terms that you use for the rest of that program.
 | |
| 
 | |
| This library is distributed in the hope that it will be useful,
 | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| Lesser General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU Lesser General Public
 | |
| License along with this library; if not, write to the Free
 | |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | |
| 02111-1307  USA
 | |
| */
 | |
| 
 | |
| /* Only include this header file once. */
 | |
| #ifndef _LTDL_H_
 | |
| #define _LTDL_H_ 1
 | |
| 
 | |
| /* Canonicalise Windows and Cygwin recognition macros.  */
 | |
| #ifdef __CYGWIN32__
 | |
| #  ifndef __CYGWIN__
 | |
| #    define __CYGWIN__ __CYGWIN32__
 | |
| #  endif
 | |
| #endif
 | |
| #ifdef _WIN32
 | |
| #  ifndef WIN32
 | |
| #    define WIN32 _WIN32
 | |
| #  endif
 | |
| #endif
 | |
| 
 | |
| /* __BEGIN_DECLS should be used at the beginning of your declarations,
 | |
|    so that C++ compilers don't mangle their names.  Use __END_DECLS at
 | |
|    the end of C declarations. */
 | |
| #undef __BEGIN_DECLS
 | |
| #undef __END_DECLS
 | |
| #ifdef __cplusplus
 | |
| # define __BEGIN_DECLS extern "C" {
 | |
| # define __END_DECLS }
 | |
| #else
 | |
| # define __BEGIN_DECLS /* empty */
 | |
| # define __END_DECLS /* empty */
 | |
| #endif
 | |
| 
 | |
| /* LTDL_PARAMS is a macro used to wrap function prototypes, so that compilers
 | |
|    that don't understand ANSI C prototypes still work, and ANSI C
 | |
|    compilers can issue warnings about type mismatches. */
 | |
| #undef LTDL_PARAMS
 | |
| #undef lt_ptr_t
 | |
| #if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) || defined(__cplusplus)
 | |
| # define LTDL_PARAMS(protos)	protos
 | |
| # define lt_ptr_t	void*
 | |
| #else
 | |
| # define LTDL_PARAMS(protos)	()
 | |
| # define lt_ptr_t	char*
 | |
| #endif
 | |
| 
 | |
| /* LTDL_STMT_START/END are used to create macros which expand to a
 | |
|    a single compound statement in a portable way. */
 | |
| #undef LTDL_STMT_START
 | |
| #undef LTDL_STMT_END
 | |
| #if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
 | |
| #  define LTDL_STMT_START        (void)(
 | |
| #  define LTDL_STMT_END          )
 | |
| #else
 | |
| #  if (defined (sun) || defined (__sun__))
 | |
| #    define LTDL_STMT_START      if (1)
 | |
| #    define LTDL_STMT_END        else (void)0
 | |
| #  else
 | |
| #    define LTDL_STMT_START      do
 | |
| #    define LTDL_STMT_END        while (0)
 | |
| #  endif
 | |
| #endif
 | |
| 
 | |
| #ifdef WIN32
 | |
| #  ifndef __CYGWIN__
 | |
| /* LTDL_DIRSEP_CHAR is accepted *in addition* to '/' as a directory
 | |
|    separator when it is set. */
 | |
| #    define LTDL_DIRSEP_CHAR	'\\'
 | |
| #    define LTDL_PATHSEP_CHAR	';'
 | |
| #  endif
 | |
| #endif
 | |
| #ifndef LTDL_PATHSEP_CHAR
 | |
| #  define LTDL_PATHSEP_CHAR	':'
 | |
| #endif
 | |
| 
 | |
| /* DLL building support on win32 hosts;  mostly to workaround their
 | |
|    ridiculous implementation of data symbol exporting. */
 | |
| #ifndef LTDL_SCOPE
 | |
| #  ifdef _WIN32
 | |
| #    ifdef DLL_EXPORT		/* defined by libtool (if required) */
 | |
| #      define LTDL_SCOPE	__declspec(dllexport)
 | |
| #    endif
 | |
| #    ifdef LIBLTDL_DLL_IMPORT	/* define if linking with this dll */
 | |
| #      define LTDL_SCOPE	extern __declspec(dllimport)
 | |
| #    endif
 | |
| #  endif
 | |
| #  ifndef LTDL_SCOPE		/* static linking or !_WIN32 */
 | |
| #    define LTDL_SCOPE	extern
 | |
| #  endif
 | |
| #endif
 | |
| 
 | |
| #include <stdlib.h>
 | |
| 
 | |
| /* 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
 | |
|    onto the table of error strings.  */
 | |
| #define ltdl_error_table						\
 | |
| 	LTDL_ERROR(UNKNOWN, "unknown error")				\
 | |
| 	LTDL_ERROR(DLOPEN_NOT_SUPPORTED, "dlopen support not available")\
 | |
| 	LTDL_ERROR(INVALID_LOADER, "invalid loader")			\
 | |
| 	LTDL_ERROR(INIT_LOADER, "loader initialization failed")		\
 | |
| 	LTDL_ERROR(REMOVE_LOADER, "loader removal failed")		\
 | |
| 	LTDL_ERROR(FILE_NOT_FOUND, "file not found")			\
 | |
| 	LTDL_ERROR(DEPLIB_NOT_FOUND, "dependency library not found")	\
 | |
| 	LTDL_ERROR(NO_SYMBOLS, "no symbols defined")			\
 | |
| 	LTDL_ERROR(CANNOT_OPEN, "can't open the module")		\
 | |
| 	LTDL_ERROR(CANNOT_CLOSE, "can't close the module")		\
 | |
| 	LTDL_ERROR(SYMBOL_NOT_FOUND, "symbol not found")		\
 | |
| 	LTDL_ERROR(NO_MEMORY, "not enough memory")			\
 | |
| 	LTDL_ERROR(INVALID_HANDLE, "invalid module handle")		\
 | |
| 	LTDL_ERROR(BUFFER_OVERFLOW, "internal buffer overflow")		\
 | |
| 	LTDL_ERROR(INVALID_ERRORCODE, "invalid errorcode")		\
 | |
| 	LTDL_ERROR(SHUTDOWN, "library already shutdown")
 | |
| 
 | |
| /* Enumerate the symbolic error names. */
 | |
| #if defined(__STDC__) || defined(__cplusplus)
 | |
| #  define LTDL_ERROR(name, diagnostic)	LTDL_ERROR_##name,
 | |
| #else
 | |
| #  define LTDL_ERROR(name, diagnostic)	LTDL_ERROR_/**/name,
 | |
| #endif
 | |
| enum {
 | |
| 	ltdl_error_table
 | |
| 	LTDL_ERROR_MAX
 | |
| };
 | |
| #undef LTDL_ERROR
 | |
| 
 | |
| /* An opaque handle for a successfully lt_dlopened module instance. */
 | |
| #ifdef _LTDL_COMPILE_
 | |
| typedef	struct lt_dlhandle_t *lt_dlhandle;
 | |
| #else
 | |
| typedef	lt_ptr_t lt_dlhandle;
 | |
| #endif
 | |
| 
 | |
| /* A preopened symbol. Arrays of this type comprise the exported
 | |
|    symbols for a dlpreopened module. */
 | |
| typedef struct {
 | |
| 	const char *name;
 | |
| 	lt_ptr_t address;
 | |
| } lt_dlsymlist;
 | |
| 
 | |
| /* Read only information pertaining to a loaded module. */
 | |
| typedef	struct {
 | |
| 	char	*filename;	/* file name */
 | |
| 	char	*name;		/* module name */
 | |
| 	int	ref_count;	/* number of times lt_dlopened minus
 | |
| 				   number of times lt_dlclosed. */
 | |
| } lt_dlinfo;
 | |
| 
 | |
| /* An opaque handle for a module loaded by a system call.  This is only
 | |
|    used internally by ltdl loaders, and by user module loaders. */
 | |
| typedef lt_ptr_t lt_module_t;
 | |
| 
 | |
| /* An opaque handle for a module loader.  */
 | |
| #ifdef _LTDL_COMPILE_
 | |
| typedef	struct lt_dlloader_t lt_dlloader_t;
 | |
| #else
 | |
| typedef	lt_ptr_t lt_dlloader_t;
 | |
| #endif
 | |
| 
 | |
| typedef lt_ptr_t lt_dlloader_data_t;
 | |
| 
 | |
| /* Function pointer types for creating user defined module loaders. */
 | |
| typedef lt_module_t lt_module_open_t LTDL_PARAMS((lt_dlloader_data_t loader_data, const char *filename));
 | |
| typedef int lt_module_close_t LTDL_PARAMS((lt_dlloader_data_t loader_data, lt_module_t handle));
 | |
| typedef lt_ptr_t lt_find_sym_t LTDL_PARAMS((lt_dlloader_data_t loader_data, lt_module_t handle, const char *symbol));
 | |
| typedef int lt_dlloader_exit_t LTDL_PARAMS((lt_dlloader_data_t loader_data));
 | |
| 
 | |
| __BEGIN_DECLS
 | |
| /* Initialisation and finalisation functions for libltdl. */
 | |
| extern int lt_dlinit LTDL_PARAMS((void));
 | |
| extern int lt_dlexit LTDL_PARAMS((void));
 | |
| 
 | |
| /* Module search path manipultation.  */
 | |
| extern int lt_dladdsearchdir LTDL_PARAMS((const char *search_dir));
 | |
| extern int lt_dlsetsearchpath LTDL_PARAMS((const char *search_path));
 | |
| extern const char *lt_dlgetsearchpath LTDL_PARAMS((void));
 | |
| 
 | |
| /* Portable libltdl versions of the system dlopen() API. */
 | |
| extern lt_dlhandle lt_dlopen LTDL_PARAMS((const char *filename));
 | |
| extern lt_dlhandle lt_dlopenext LTDL_PARAMS((const char *filename));
 | |
| extern lt_ptr_t lt_dlsym LTDL_PARAMS((lt_dlhandle handle, const char *name));
 | |
| extern const char *lt_dlerror LTDL_PARAMS((void));
 | |
| extern int lt_dlclose LTDL_PARAMS((lt_dlhandle handle));
 | |
| 
 | |
| /* Support for preloaded modules through lt_dlopen() API. */
 | |
| extern int lt_dlpreload LTDL_PARAMS((const lt_dlsymlist *preloaded));
 | |
| extern int lt_dlpreload_default LTDL_PARAMS((const lt_dlsymlist *preloaded));
 | |
| 
 | |
| #define LTDL_SET_PRELOADED_SYMBOLS() 		LTDL_STMT_START{	\
 | |
| 	extern const lt_dlsymlist lt_preloaded_symbols[];		\
 | |
| 	lt_dlpreload_default(lt_preloaded_symbols);			\
 | |
| 						}LTDL_STMT_END
 | |
| 
 | |
| /* Managing user data associated with a loaded modules.  */
 | |
| extern const lt_dlinfo *lt_dlgetinfo LTDL_PARAMS((lt_dlhandle handle));
 | |
| extern int lt_dlforeach LTDL_PARAMS((
 | |
| 		int (*func)(lt_dlhandle handle, lt_ptr_t data), lt_ptr_t data));
 | |
| 
 | |
| /* User module loader API. */
 | |
| struct lt_user_dlloader {
 | |
| 	const char *sym_prefix;
 | |
| 	lt_module_open_t *module_open;
 | |
| 	lt_module_close_t *module_close;
 | |
| 	lt_find_sym_t *find_sym;
 | |
| 	lt_dlloader_exit_t *dlloader_exit;
 | |
|   	lt_dlloader_data_t dlloader_data;
 | |
| };
 | |
| 
 | |
| 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_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));
 | |
| extern int lt_dlseterror LTDL_PARAMS((int errorcode));
 | |
| 
 | |
| /* Pointers to memory management functions to be used by libltdl. */
 | |
| LTDL_SCOPE lt_ptr_t (*lt_dlmalloc)LTDL_PARAMS((size_t size));
 | |
| LTDL_SCOPE void (*lt_dlfree)LTDL_PARAMS((lt_ptr_t ptr));
 | |
| 
 | |
| __END_DECLS
 | |
| 
 | |
| #endif /* !_LTDL_H_ */
 |