1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/lib/misc/lib.h

98 lines
2.6 KiB
C
Raw Normal View History

2002-11-18 17:01:16 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
* Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
2002-11-18 17:01:16 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
2004-03-30 23:35:44 +04:00
*
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2002-11-18 17:01:16 +03:00
*/
/*
* This file must be included first by every library source file.
2002-11-18 17:01:16 +03:00
*/
#ifndef _LVM_LIB_H
#define _LVM_LIB_H
#include "configure.h"
2002-11-18 17:01:16 +03:00
#define _REENTRANT
#define _GNU_SOURCE
2004-04-16 22:43:29 +04:00
#define _FILE_OFFSET_BITS 64
2002-11-18 17:01:16 +03:00
macros: fix default symbol export control Fix the version export macros to make it possible to export two different DM_* versions of a symbol: currently it is only possible for a DM_* symbol to override a symbol in Base. Attempting to export two symbols at different DM_* version levels (e.g. DM_1_02_104 and DM_1_02_106) leads to a linker error due to a duplicate symbol definition. This is because the DM_EXPORTED_SYMBOL macro makes each exported symbol the default (@@VERSION): __asm__(".symver " #func "_v" #ver ", " #func "@@DM_" #ver ) Fix the macro to use a single '@' for a symbols exported in multiple versions and rename the macros to DM_EXPORT_*: DM_EXPORT_SYMBOL(func,ver) DM_EXPORT_SYMBOL_BASE(func,ver) For functions that have multiple implementations these macros control symbol export and versioning. Function definitions that exist in only one version never need to use these macros. Backwards compatible implementations must include a version tag of the form "_v1_02_104" as a suffix to the function name and use the macro DM_EXPORT_SYMBOL to export the function and bind it to the specified version string. Since versioning is only available when compiling with GCC the entire compatibility version should be enclosed in '#if defined(__GNUC__)', for example: int dm_foo(int bar) { return bar; } #if defined(__GNUC__) // Backward compatible dm_foo() version 1.02.104 int dm_foo_v1_02_104(void); int dm_foo_v1_02_104(void) { return 0; } DM_EXPORT_SYMBOL(dm_foo,1_02_104) #endif A prototype for the compatibility version is required as these functions must not be declared static. The DM_EXPORT_SYMBOL_BASE macro is only used to export the base versions of library symbols prior to the introduction of symbol versioning: it must never be used for new symbols.
2015-08-21 23:15:10 +03:00
/*
* Symbol export control macros
*
* DM_EXPORT_SYMBOL(func,ver)
* DM_EXPORT_SYMBOL_BASE(func,ver)
*
* For functions that have multiple implementations these macros control
* symbol export and versioning.
*
* Function definitions that exist in only one version never need to use
* these macros.
*
* Backwards compatible implementations must include a version tag of
* the form "_v1_02_104" as a suffix to the function name and use the
* macro DM_EXPORT_SYMBOL to export the function and bind it to the
* specified version string.
*
* Since versioning is only available when compiling with GCC the entire
* compatibility version should be enclosed in '#if defined(__GNUC__)',
* for example:
*
* int dm_foo(int bar)
* {
* return bar;
* }
*
* #if defined(__GNUC__)
* // Backward compatible dm_foo() version 1.02.104
* int dm_foo_v1_02_104(void);
* int dm_foo_v1_02_104(void)
* {
* return 0;
* }
* DM_EXPORT_SYMBOL(dm_foo,1_02_104)
* #endif
*
* A prototype for the compatibility version is required as these
* functions must not be declared static.
*
* The DM_EXPORT_SYMBOL_BASE macro is only used to export the base
* versions of library symbols prior to the introduction of symbol
* versioning: it must never be used for new symbols.
*/
#if defined(__GNUC__)
macros: fix default symbol export control Fix the version export macros to make it possible to export two different DM_* versions of a symbol: currently it is only possible for a DM_* symbol to override a symbol in Base. Attempting to export two symbols at different DM_* version levels (e.g. DM_1_02_104 and DM_1_02_106) leads to a linker error due to a duplicate symbol definition. This is because the DM_EXPORTED_SYMBOL macro makes each exported symbol the default (@@VERSION): __asm__(".symver " #func "_v" #ver ", " #func "@@DM_" #ver ) Fix the macro to use a single '@' for a symbols exported in multiple versions and rename the macros to DM_EXPORT_*: DM_EXPORT_SYMBOL(func,ver) DM_EXPORT_SYMBOL_BASE(func,ver) For functions that have multiple implementations these macros control symbol export and versioning. Function definitions that exist in only one version never need to use these macros. Backwards compatible implementations must include a version tag of the form "_v1_02_104" as a suffix to the function name and use the macro DM_EXPORT_SYMBOL to export the function and bind it to the specified version string. Since versioning is only available when compiling with GCC the entire compatibility version should be enclosed in '#if defined(__GNUC__)', for example: int dm_foo(int bar) { return bar; } #if defined(__GNUC__) // Backward compatible dm_foo() version 1.02.104 int dm_foo_v1_02_104(void); int dm_foo_v1_02_104(void) { return 0; } DM_EXPORT_SYMBOL(dm_foo,1_02_104) #endif A prototype for the compatibility version is required as these functions must not be declared static. The DM_EXPORT_SYMBOL_BASE macro is only used to export the base versions of library symbols prior to the introduction of symbol versioning: it must never be used for new symbols.
2015-08-21 23:15:10 +03:00
#define DM_EXPORT_SYMBOL(func, ver) \
__asm__(".symver " #func "_v" #ver ", " #func "@DM_" #ver )
#define DM_EXPORT_SYMBOL_BASE(func) \
__asm__(".symver " #func "_base, " #func "@Base" )
#else
macros: fix default symbol export control Fix the version export macros to make it possible to export two different DM_* versions of a symbol: currently it is only possible for a DM_* symbol to override a symbol in Base. Attempting to export two symbols at different DM_* version levels (e.g. DM_1_02_104 and DM_1_02_106) leads to a linker error due to a duplicate symbol definition. This is because the DM_EXPORTED_SYMBOL macro makes each exported symbol the default (@@VERSION): __asm__(".symver " #func "_v" #ver ", " #func "@@DM_" #ver ) Fix the macro to use a single '@' for a symbols exported in multiple versions and rename the macros to DM_EXPORT_*: DM_EXPORT_SYMBOL(func,ver) DM_EXPORT_SYMBOL_BASE(func,ver) For functions that have multiple implementations these macros control symbol export and versioning. Function definitions that exist in only one version never need to use these macros. Backwards compatible implementations must include a version tag of the form "_v1_02_104" as a suffix to the function name and use the macro DM_EXPORT_SYMBOL to export the function and bind it to the specified version string. Since versioning is only available when compiling with GCC the entire compatibility version should be enclosed in '#if defined(__GNUC__)', for example: int dm_foo(int bar) { return bar; } #if defined(__GNUC__) // Backward compatible dm_foo() version 1.02.104 int dm_foo_v1_02_104(void); int dm_foo_v1_02_104(void) { return 0; } DM_EXPORT_SYMBOL(dm_foo,1_02_104) #endif A prototype for the compatibility version is required as these functions must not be declared static. The DM_EXPORT_SYMBOL_BASE macro is only used to export the base versions of library symbols prior to the introduction of symbol versioning: it must never be used for new symbols.
2015-08-21 23:15:10 +03:00
#define DM_EXPORT_SYMBOL(func, ver)
#define DM_EXPORT_SYMBOL_BASE(func)
#endif
2004-02-14 01:56:45 +03:00
#include "intl.h"
2008-11-01 05:19:19 +03:00
#include "libdevmapper.h"
#include "util.h"
#ifdef DM
# include "dm-logging.h"
#else
# include "lvm-logging.h"
# include "lvm-globals.h"
# include "lvm-wrappers.h"
# include "lvm-maths.h"
#endif
2008-11-01 05:19:19 +03:00
#include <unistd.h>
2002-11-18 17:01:16 +03:00
#endif