diff --git a/configure b/configure index 6dd7eda..ef6a416 100755 --- a/configure +++ b/configure @@ -959,6 +959,7 @@ enable_fsadm enable_blkdeactivate enable_dmeventd enable_selinux +enable_symvers enable_nls with_localedir with_confdir @@ -1677,6 +1678,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: @@ -3077,7 +3081,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 @@ -12969,6 +12972,33 @@ 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/lib/misc/lib.h b/lib/misc/lib.h index c14f437..79b36a3 100644 --- a/lib/misc/lib.h +++ b/lib/misc/lib.h @@ -62,7 +62,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 06bd31a..8f36ec7 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(). @@ -254,6 +254,4 @@ dm_bitset_t dm_bitset_parse_list_v1_02_129(const char *str, struct dm_pool *mem) } 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 dd46b67..b09abdc 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -2176,7 +2176,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 ee12da2..08829c5 100644 --- a/libdm/libdm-deptree.c +++ b/libdm/libdm-deptree.c @@ -3811,7 +3811,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 420e3e1..066bcdf 100644 --- a/libdm/libdm-stats.c +++ b/libdm/libdm-stats.c @@ -5067,7 +5067,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,