Annotation of embedaddon/libiconv/woe32dll/export.h, revision 1.1

1.1     ! misho       1: /* Exporting symbols from Cygwin shared libraries.
        !             2:    Copyright (C) 2006 Free Software Foundation, Inc.
        !             3:    Written by Bruno Haible <bruno@clisp.org>, 2006.
        !             4: 
        !             5:    This program is free software: you can redistribute it and/or modify
        !             6:    it under the terms of the GNU General Public License as published by
        !             7:    the Free Software Foundation; either version 3 of the License, or
        !             8:    (at your option) any later version.
        !             9: 
        !            10:    This program is distributed in the hope that it will be useful,
        !            11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            13:    GNU General Public License for more details.
        !            14: 
        !            15:    You should have received a copy of the GNU General Public License
        !            16:    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
        !            17: 
        !            18: /* There are four ways to build shared libraries on Cygwin:
        !            19: 
        !            20:    - Export only functions, no variables.
        !            21:      This has the drawback of severely affecting the programming style in use.
        !            22:      It does not let the programmer use full ANSI C.  It lets one platform
        !            23:      dictate the code style on all platforms.  This is unacceptable.
        !            24: 
        !            25:    - Use the GNU ld --enable-auto-import option.  It is the default on Cygwin
        !            26:      since July 2005. But it has three fatal drawbacks:
        !            27:        - It produces executables and shared libraries with relocations in the
        !            28:          .text segment, defeating the principles of virtual memory.
        !            29:        - For some constructs such as
        !            30:              extern int var;
        !            31:              int * const b = &var;
        !            32:          it creates an executable that will give an error at runtime, rather
        !            33:          than either a compile-time or link-time error or a working executable.
        !            34:          (This is with both gcc and g++.) Whereas this code, not relying on
        !            35:          auto-import:
        !            36:              extern __declspec (dllimport) int var;
        !            37:              int * const b = &var;
        !            38:          gives a compile-time error with gcc and works with g++.
        !            39:        - It doesn't work in some cases (references to a member field of an
        !            40:          exported struct variable, or to a particular element of an exported
        !            41:          array variable), requiring code modifications.  Again one platform
        !            42:          dictates code modifications on all platforms.
        !            43: 
        !            44:      This is unacceptable.  Therefore we disable this option, through the
        !            45:      woe32-dll.m4 autoconf macro.
        !            46: 
        !            47:    - Define a macro that expands to  __declspec(dllexport)  when building
        !            48:      the library and to  __declspec(dllimport)  when building code outside
        !            49:      the library, and use it in all header files of the library.
        !            50:      This is acceptable if
        !            51:        1. the header files are unique to this library (not shared with
        !            52:           other packages), and
        !            53:        2. the library sources are contained in one directory, making it easy
        !            54:           to define a -DBUILDING_LIBXYZ flag for the library.
        !            55:      Example:
        !            56:          #ifdef BUILDING_LIBASPRINTF
        !            57:          #define LIBASPRINTF_DLL_EXPORTED __declspec(dllexport)
        !            58:          #else
        !            59:          #define LIBASPRINTF_DLL_EXPORTED __declspec(dllimport)
        !            60:          #endif
        !            61: 
        !            62:      We use this technique for the libintl and the libasprintf libraries.
        !            63: 
        !            64:    - Define a macro that expands to  __declspec(dllimport)  always, and use
        !            65:      it in all header files of the library.  Use an explicit export list for
        !            66:      the library.
        !            67:      This is acceptable if
        !            68:        1. the programming language is not C++ (because the name mangling of
        !            69:           static struct/class fields and of variables in namespaces makes it
        !            70:           hard to maintain an export list).
        !            71:      The benefit of this approach is that the partitioning of the source files
        !            72:      into libraries (which source file goes into which library) does not
        !            73:      affect the source code; only the Makefiles reflect it.
        !            74:      The performance loss due to the unnecessary indirection for references
        !            75:      to variables from within the library defining the variable is acceptable.
        !            76: 
        !            77:      We use this technique for libgettextlib (because it contains many gnulib
        !            78:      modules) and for libgettextsrc (because this makes it easy to move source
        !            79:      code from an msg* program to libgettextsrc).  The macro is called
        !            80:      DLL_VARIABLE.
        !            81: 
        !            82:    This file allows building an explicit export list.  You can either
        !            83:      - specify the variables to be exported, and use the GNU ld option
        !            84:        --export-all-symbols to export all function names, or
        !            85:      - specify the variables and functions to be exported explicitly.
        !            86: 
        !            87:    Note: --export-all-symbols is the default when no other symbol is explicitly
        !            88:    exported.  This means, the use of an explicit export on the variables has
        !            89:    the effect of no longer exporting the functions! - until the option
        !            90:    --export-all-symbols is used.  */
        !            91: 
        !            92:  /* IMP(x) is a symbol that contains the address of x.  */
        !            93: #define IMP(x) _imp__##x
        !            94: 
        !            95:  /* Ensure that the variable x is exported from the library, and that a
        !            96:     pseudo-variable IMP(x) is available.  */
        !            97: #define VARIABLE(x) \
        !            98:  /* Export x without redefining x.  This code was found by compiling a \
        !            99:     snippet:                                                           \
        !           100:       extern __declspec(dllexport) int x; int x = 42;  */              \
        !           101:  asm (".section .drectve\n");                                          \
        !           102:  asm (".ascii \" -export:" #x ",data\"\n");                            \
        !           103:  asm (".data\n");                                                      \
        !           104:  /* Allocate a pseudo-variable IMP(x).  */                             \
        !           105:  extern int x;                                                         \
        !           106:  void * IMP(x) = &x;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>