mirror of
git://git.savannah.gnu.org/libtool.git
synced 2024-11-27 06:09:57 +08:00
706e672811
operation of libtool (neither would work alone). First, there is a new feature that allows libraries to preopen modules. This entails a backwards incompatible change to the libltdl API for separating out the preloaded symbol lists by owner. Second, in the tradition of "eating our own dogfood", libltdl now preloads its own dlloaders. The internal API for dlloaders has also had to change in a backwards incompatible way in support of the new library preloading feature. If you don't use preloaded libraries, you needn't change your project sources, though you will need to recompile against the new libltdl. The API changes are mostly confined to dlloaders, so you probably needn't worry about those (unless you have written a custom loader that you want libltdl to use): * configure.ac (AC_CONFIG_FILES): Add libltdl/loaders/Makefile. * libltdl/configure.ac (AC_CONFIG_FILES): Add loaders/Makefile. * libltdl/loaders: New directory for module loaders, to simplify Makefile rules, and to give the loaders themselves names that are unique in the first few characters. * libtoolize.in (func_copy_all_files): Copy recursively to pick up the loaders directory contents. * libltdl/loaders/Makefile.am: New file. Move module building rules to here... * libltdl/Makefile.am: ...from here. (VERSION_INFO): Bumped version info to signify interface changes. (libltdl_la_CPPFLAGS, libltdlc_la_CPPFLAGS): Set LTDLOPEN appropriately for each library. * libltdl/loader-dld_link.c, libltdl/loader-dlopen.c, libltdl/loader-dyld.c, libltdl/loader-load_add_on.c, libltdl/loader-loadlibrary.c libltdl/loader-preopen.c, libltdl/loader-shl_load.c: Moved from here... * libltdl/loaders/dld_link.c, libltdl/loaders/dlopen.c, libltdl/loaders/dyld.c, libltdl/loaders/load_add_on.c, libltdl/loaders/loadlibrary.c libltdl/loaders/preopen.c, libltdl/loaders/shl_load.c: ...to here. (get_vtable): New entry function for each. * libltdl/loaders/preopen.c (lt_dlsymlists_t): Replaced by... (symlist_chain): ...a new structure which maps lists of preloaded symbols from the object that loads them. (lt_dlpreload_open): New function to automatically open all preloaded modules belonging to a named object (ORIGINATOR). * libltdl/lt__alloc.c (lt__zalloc): New function to return a block of zeroed out new memory. * libltdl/lt__alloc.h (lt__zalloc): Prototype it. * libltdl/lt__private.h (lt__alloc_die_callback): Add missing prototype. (lt__error_strings): Make this opaque to callers. * libltdl/lt_error.c (lt__error_strings): Move the implementation to here. * libltdl/lt_dlloader.h (lt_user_dlloader): Add extra fields to make originator focused preloading possible. *BREAKS BACKWARDS COMPATIBILITY* (lt_dlloader_add): Take advantage of new fields to simplify paramater list. * libltdl/lt_system.h (LT_STR): New ANSI stringification macro. (LT_CONC): Fix it to work from within macros. * libltdl/ltdl.c (loader_init, loader_init_callback): Simplify dlloader loading. (get_vtable, preloaded_symbols): Point these at the preopen.c symbols to bootstrap the loader chain. (lt_dlinit): Load the preopen dlloader manually, and then use it to load any other preloaded dlloaders. (lt_dlloader_add): Simplify parameter list. Populate new fields. Chain new loaders according to priority field. * libltdl/ltdl.h (lt_dlsymlist): Add a new originator field. (lt_dlpreload_callback_func): Type of a callback for automatic lt_dlpreload_open loading. (LTDL_SET_PRELOADED_SYMBOLS): Adjust to hook into preloaded symbols from the "@PROGRAM@" originator. * tests/demo/dlmain.c (main): Use mangled preloaded_symbols symbol. * tests/pdemo/longer_file_name_dlmain.c (main): Ditto. * ltmain.in: Don't spew spurious warnings when dlopening and dlpreopening modules. (func_generate_dlsyms): Factored out from multiple copies in the rest of the code. Generate originator keyed symbol lists. (func_extract_archives): Also factored. Extract the contents of convenience archives for linking with dependent libraries when --whole-archive is not available. [darwin]: Don't try to link $old_library unless it exists, and $lib is a bundle. * m4/ltdl.m4 (AC_LTDL_DLLIB): Check for all possible dynamic loading libraries/apis rather that stopping when an acceptable one is discovered. (LT_DLLOADERS): New variable for holding dlloaders that can be preloaded. * doc/libtool.texi: Document interface changes. * NEWS: Updated.
152 lines
4.6 KiB
C
152 lines
4.6 KiB
C
/* lt_system.h -- system portability abstraction layer
|
|
Copyright (C) 2004 Free Software Foundation, Inc.
|
|
Originally by Gary V. Vaughan <gary@gnu.org>
|
|
|
|
NOTE: The canonical source of this file is maintained with the
|
|
GNU Libtool package. Report bugs to bug-libtool@gnu.org.
|
|
|
|
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
|
|
*/
|
|
|
|
#if !defined(LT_SYSTEM_H)
|
|
#define LT_SYSTEM_H 1
|
|
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
|
|
/* Some systems do not define EXIT_*, even with STDC_HEADERS. */
|
|
#if !defined(EXIT_SUCCESS)
|
|
# define EXIT_SUCCESS 0
|
|
#endif
|
|
#if !defined(EXIT_FAILURE)
|
|
# define EXIT_FAILURE 1
|
|
#endif
|
|
|
|
/* Just pick a big number... */
|
|
#define LT_FILENAME_MAX 2048
|
|
|
|
|
|
/* Saves on those hard to debug '\0' typos.... */
|
|
#define LT_EOS_CHAR '\0'
|
|
|
|
/* LTDL_BEGIN_C_DECLS should be used at the beginning of your declarations,
|
|
so that C++ compilers don't mangle their names. Use LTDL_END_C_DECLS at
|
|
the end of C declarations. */
|
|
#if defined(__cplusplus)
|
|
# define LT_BEGIN_C_DECLS extern "C" {
|
|
# define LT_END_C_DECLS }
|
|
#else
|
|
# define LT_BEGIN_C_DECLS /* empty */
|
|
# define LT_END_C_DECLS /* empty */
|
|
#endif
|
|
|
|
/* LT_STMT_START/END are used to create macros which expand to a
|
|
a single compound statement in a portable way. */
|
|
#if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
|
|
# define LT_STMT_START (void)(
|
|
# define LT_STMT_END )
|
|
#else
|
|
# if (defined (sun) || defined (__sun__))
|
|
# define LT_STMT_START if (1)
|
|
# define LT_STMT_END else (void)0
|
|
# else
|
|
# define LT_STMT_START do
|
|
# define LT_STMT_END while (0)
|
|
# endif
|
|
#endif
|
|
|
|
/* Canonicalise Windows and Cygwin recognition macros.
|
|
To match the values set by recent Cygwin compilers, make sure that if
|
|
__CYGWIN__ is defined (after canonicalisation), __WINDOWS__ is NOT! */
|
|
#if defined(__CYGWIN32__) && !defined(__CYGWIN__)
|
|
# define __CYGWIN__ __CYGWIN32__
|
|
#endif
|
|
#if defined(__CYGWIN__)
|
|
# if defined(__WINDOWS__)
|
|
# undef __WINDOWS__
|
|
# endif
|
|
#elif defined(_WIN32)
|
|
# define __WINDOWS__ _WIN32
|
|
#elif defined(WIN32)
|
|
# define __WINDOWS__ WIN32
|
|
#endif
|
|
#if defined(__CYGWIN__) && defined(__WINDOWS__)
|
|
# undef __WINDOWS__
|
|
#endif
|
|
|
|
|
|
/* DLL building support on win32 hosts; mostly to workaround their
|
|
ridiculous implementation of data symbol exporting. */
|
|
#if !defined(LT_SCOPE)
|
|
# if defined(__WINDOWS__)
|
|
# if defined(DLL_EXPORT) /* defined by libtool (if required) */
|
|
# define LT_SCOPE __declspec(dllexport)
|
|
# endif
|
|
# if defined(LIBLTDL_DLL_IMPORT) /* define if linking with this dll */
|
|
# define LT_SCOPE extern __declspec(dllimport)
|
|
# endif
|
|
# endif
|
|
# if !defined(LT_SCOPE) /* static linking or !__WINDOWS__ */
|
|
# define LT_SCOPE extern
|
|
# endif
|
|
#endif
|
|
|
|
#if defined(__WINDOWS__)
|
|
/* LT_DIRSEP_CHAR is accepted *in addition* to '/' as a directory
|
|
separator when it is set. */
|
|
# define LT_DIRSEP_CHAR '\\'
|
|
# define LT_PATHSEP_CHAR ';'
|
|
#else
|
|
# define LT_PATHSEP_CHAR ':'
|
|
#endif
|
|
|
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
# define R_OK 4
|
|
#endif
|
|
|
|
/* fopen() mode flags for reading a text file */
|
|
#undef LT_READTEXT_MODE
|
|
#if defined(__WINDOWS__) || defined(__CYGWIN__)
|
|
# define LT_READTEXT_MODE "rt"
|
|
#else
|
|
# define LT_READTEXT_MODE "r"
|
|
#endif
|
|
|
|
/* The extra indirection to the LT__STR and LT__CONC macros is required so
|
|
that if the arguments to LT_STR() (or LT_CONC()) are themselves macros,
|
|
they will be expanded before being quoted. */
|
|
#ifndef LT_STR
|
|
# define LT__STR(arg) #arg
|
|
# define LT_STR(arg) LT__STR(arg)
|
|
#endif
|
|
|
|
#ifndef LT_CONC
|
|
# define LT__CONC(a, b) a##b
|
|
# define LT_CONC(a, b) LT__CONC(a, b)
|
|
#endif
|
|
#ifndef LT_CONC3
|
|
# define LT__CONC3(a, b, c) a##b##c
|
|
# define LT_CONC3(a, b, c) LT__CONC3(a, b, c)
|
|
#endif
|
|
|
|
#endif /*!defined(LT_SYSTEM_H)*/
|