diff --git a/configure b/configure index 7d945dfa8..94cd6b1ea 100755 --- a/configure +++ b/configure @@ -975,6 +975,7 @@ enable_fsadm enable_blkdeactivate enable_dmeventd enable_selinux +enable_symvers enable_nls with_localedir with_confdir @@ -1725,6 +1726,9 @@ Optional Features: --disable-blkdeactivate disable blkdeactivate --enable-dmeventd enable the device-mapper event daemon --disable-selinux disable selinux support + --enable-symvers[=STYLE] + enables symbol versioning of the shared library + [default=gnu] --enable-nls enable Native Language Support Optional Packages: @@ -3156,7 +3160,6 @@ if test -z "$CFLAGS"; then : fi case "$host_os" in linux*) - CLDFLAGS="${CLDFLAGS:"$LDFLAGS"} -Wl,--version-script,.export.sym" # equivalent to -rdynamic ELDFLAGS="-Wl,--export-dynamic" # FIXME Generate list and use --dynamic-list=.dlopen.sym @@ -3178,7 +3181,6 @@ case "$host_os" in ;; darwin*) CFLAGS="$CFLAGS -no-cpp-precomp -fno-common" - CLDFLAGS="${CLDFLAGS:"$LDFLAGS"}" ELDFLAGS= CLDWHOLEARCHIVE="-all_load" CLDNOWHOLEARCHIVE= @@ -14401,6 +14403,32 @@ done LIBS=$lvm_saved_libs fi +################################################################################ +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable symbol versioning" >&5 +$as_echo_n "checking whether to enable symbol versioning... " >&6; } +# Check whether --enable-symvers was given. +if test "${enable_symvers+set}" = set; then : + enableval=$enable_symvers; + case "$enableval" in + gnu|no) ;; + *) as_fn_error $? "Unknown argument to enable/disable symvers" "$LINENO" 5 ;; + esac +else + enable_symvers=gnu +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_symvers" >&5 +$as_echo "$enable_symvers" >&6; } + +if test x$GCC = xyes && test x$enable_symvers = xgnu ; then + +$as_echo "#define GNU_SYMVER 1" >>confdefs.h + + case "$host_os" in + linux*) CLDFLAGS="$CLDFLAGS -Wl,--version-script,.export.sym" ;; + esac +fi + ################################################################################ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable internationalisation" >&5 $as_echo_n "checking whether to enable internationalisation... " >&6; } diff --git a/include/configure.h.in b/include/configure.h.in index 15fd150ed..7a07a10ef 100644 --- a/include/configure.h.in +++ b/include/configure.h.in @@ -147,6 +147,9 @@ /* Path to fsadm binary. */ #undef FSADM_PATH +/* Define to use GNU versioning in the shared library. */ +#undef GNU_SYMVER + /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM diff --git a/lib/misc/lib.h b/lib/misc/lib.h index d7fa5c721..7cf98f932 100644 --- a/lib/misc/lib.h +++ b/lib/misc/lib.h @@ -41,16 +41,16 @@ * 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: + * Since versioning is only available when compiling with GCC + * and GLIBC the entire compatibility version should be enclosed + * in '#if defined(GNU_SYMVER)', for example: * * int dm_foo(int bar) * { * return bar; * } * - * #if defined(__GNUC__) + * #if defined(GNU_SYMVER) * // Backward compatible dm_foo() version 1.02.104 * int dm_foo_v1_02_104(void); * int dm_foo_v1_02_104(void) @@ -67,7 +67,7 @@ * versions of library symbols prior to the introduction of symbol * versioning: it must never be used for new symbols. */ -#if defined(__GNUC__) +#if defined(GNU_SYMVER) #define DM_EXPORT_SYMBOL(func, ver) \ __asm__(".symver " #func "_v" #ver ", " #func "@DM_" #ver ) #define DM_EXPORT_SYMBOL_BASE(func) \ diff --git a/libdm/datastruct/bitset.c b/libdm/datastruct/bitset.c index b0826e1eb..2ec3f8f84 100644 --- a/libdm/datastruct/bitset.c +++ b/libdm/datastruct/bitset.c @@ -242,7 +242,7 @@ bad: return NULL; } -#if defined(__GNUC__) +#if defined(GNU_SYMVER) /* * Maintain backward compatibility with older versions that did not * accept a 'min_num_bits' argument to dm_bitset_parse_list(). @@ -253,7 +253,4 @@ dm_bitset_t dm_bitset_parse_list_v1_02_129(const char *str, struct dm_pool *mem) return dm_bitset_parse_list(str, mem, 0); } DM_EXPORT_SYMBOL(dm_bitset_parse_list, 1_02_129); - -#else /* if defined(__GNUC__) */ - #endif diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index 769b69c1b..28e2eadee 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -2145,7 +2145,7 @@ void dm_lib_exit(void) _version_checked = 0; } -#if defined(__GNUC__) +#if defined(GNU_SYMVER) /* * Maintain binary backward compatibility. * Version script mechanism works with 'gcc' compatible compilers only. diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c index ab0545659..00651c0b2 100644 --- a/libdm/libdm-deptree.c +++ b/libdm/libdm-deptree.c @@ -3797,7 +3797,7 @@ void dm_tree_node_set_callback(struct dm_tree_node *dnode, dnode->callback_data = data; } -#if defined(__GNUC__) +#if defined(GNU_SYMVER) /* * Backward compatible implementations. * diff --git a/libdm/libdm-stats.c b/libdm/libdm-stats.c index 94ad380e0..76efbbe35 100644 --- a/libdm/libdm-stats.c +++ b/libdm/libdm-stats.c @@ -5065,7 +5065,7 @@ int dm_stats_start_filemapd(int fd, uint64_t group_id, const char *path, * current dm_stats_create_region() version. */ -#if defined(__GNUC__) +#if defined(GNU_SYMVER) int dm_stats_create_region_v1_02_106(struct dm_stats *dms, uint64_t *region_id, uint64_t start, uint64_t len, int64_t step, int precise, const char *program_id, -- 2.18.0