2018-07-26 19:15:24 +02:00
|
|
|
From 94d71c49eb1682a73465eb162b0a059561168bb2 Mon Sep 17 00:00:00 2001
|
2018-07-26 19:15:23 +02:00
|
|
|
From: Marcin Niestroj <m.niestroj@grinn-global.com>
|
|
|
|
Date: Fri, 20 Jul 2018 14:26:44 +0200
|
|
|
|
Subject: [PATCH] configure: Introduce --enable-symvers option
|
|
|
|
|
|
|
|
Only few libc (e.g. glibc) libraries support full symbol version
|
|
|
|
resolution in runtime. There are lot of standard libraries that do not
|
|
|
|
support that, such as dietlibc, musl and uclibc. Hence there is no
|
|
|
|
reason to generate symbol versions when compiling against them.
|
|
|
|
|
|
|
|
Additionally libdevmapper.so was broken when compiled against
|
|
|
|
uclibc. Runtime linker loader caused calling dm_task_get_info_base()
|
|
|
|
function recursively, leading to segmentation fault.
|
|
|
|
|
|
|
|
Introduce --enable-symvers[=STYLE] option, which allows to choose
|
|
|
|
between gnu and disabled symbol versioning. By default gnu symbol
|
|
|
|
versioning is used to provide backward compatibility.
|
|
|
|
__GNUC__ check is replaced now with GNU_SYMVER, which is generated by
|
|
|
|
configure script. Additionally ld version script is included only in
|
|
|
|
case of gnu option, which slightly reduces output size.
|
|
|
|
|
|
|
|
Providing --disable-symvers to configure script when building against
|
|
|
|
uclibc library fixes segmentation fault error described above, due to
|
|
|
|
lack of several versions of the same symbol in libdevmapper.so
|
|
|
|
library.
|
|
|
|
|
|
|
|
Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
|
|
|
|
---
|
|
|
|
configure | 32 ++++++++++++++++++++++++++++++--
|
2018-07-26 19:15:24 +02:00
|
|
|
configure.ac | 28 +++++++++++++++++++++++++---
|
2018-07-26 19:15:23 +02:00
|
|
|
include/configure.h.in | 3 +++
|
|
|
|
lib/misc/lib.h | 10 +++++-----
|
|
|
|
libdm/datastruct/bitset.c | 5 +----
|
|
|
|
libdm/ioctl/libdm-iface.c | 2 +-
|
|
|
|
libdm/libdm-deptree.c | 2 +-
|
|
|
|
libdm/libdm-stats.c | 2 +-
|
|
|
|
8 files changed, 67 insertions(+), 17 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/configure b/configure
|
2018-07-26 19:15:24 +02:00
|
|
|
index 7d945dfa8..94cd6b1ea 100755
|
2018-07-26 19:15:23 +02:00
|
|
|
--- a/configure
|
|
|
|
+++ b/configure
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -975,6 +975,7 @@ enable_fsadm
|
2018-07-26 19:15:23 +02:00
|
|
|
enable_blkdeactivate
|
|
|
|
enable_dmeventd
|
|
|
|
enable_selinux
|
|
|
|
+enable_symvers
|
|
|
|
enable_nls
|
|
|
|
with_localedir
|
|
|
|
with_confdir
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -1725,6 +1726,9 @@ Optional Features:
|
2018-07-26 19:15:23 +02:00
|
|
|
--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:
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -3156,7 +3160,6 @@ if test -z "$CFLAGS"; then :
|
2018-07-26 19:15:23 +02:00
|
|
|
fi
|
|
|
|
case "$host_os" in
|
|
|
|
linux*)
|
|
|
|
- CLDFLAGS="$CLDFLAGS -Wl,--version-script,.export.sym"
|
2018-07-26 19:15:24 +02:00
|
|
|
# equivalent to -rdynamic
|
2018-07-26 19:15:23 +02:00
|
|
|
ELDFLAGS="-Wl,--export-dynamic"
|
|
|
|
# FIXME Generate list and use --dynamic-list=.dlopen.sym
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -3178,7 +3181,6 @@ case "$host_os" in
|
2018-07-26 19:15:23 +02:00
|
|
|
;;
|
|
|
|
darwin*)
|
|
|
|
CFLAGS="$CFLAGS -no-cpp-precomp -fno-common"
|
|
|
|
- CLDFLAGS="$CLDFLAGS"
|
|
|
|
ELDFLAGS=
|
|
|
|
CLDWHOLEARCHIVE="-all_load"
|
|
|
|
CLDNOWHOLEARCHIVE=
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -14401,6 +14403,32 @@ done
|
2018-07-26 19:15:23 +02:00
|
|
|
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; }
|
2018-07-26 19:15:24 +02:00
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
|
|
index e427708cd..2e8712f92 100644
|
|
|
|
--- a/configure.ac
|
|
|
|
+++ b/configure.ac
|
|
|
|
@@ -30,13 +30,11 @@ AC_CANONICAL_TARGET([])
|
2018-07-26 19:15:23 +02:00
|
|
|
AS_IF([test -z "$CFLAGS"], [COPTIMISE_FLAG="-O2"])
|
|
|
|
case "$host_os" in
|
|
|
|
linux*)
|
|
|
|
- CLDFLAGS="$CLDFLAGS -Wl,--version-script,.export.sym"
|
2018-07-26 19:15:24 +02:00
|
|
|
# equivalent to -rdynamic
|
2018-07-26 19:15:23 +02:00
|
|
|
ELDFLAGS="-Wl,--export-dynamic"
|
|
|
|
# FIXME Generate list and use --dynamic-list=.dlopen.sym
|
|
|
|
CLDWHOLEARCHIVE="-Wl,-whole-archive"
|
|
|
|
CLDNOWHOLEARCHIVE="-Wl,-no-whole-archive"
|
|
|
|
- LDDEPS="$LDDEPS .export.sym"
|
|
|
|
LIB_SUFFIX=so
|
|
|
|
DEVMAPPER=yes
|
|
|
|
BUILD_LVMETAD=no
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -52,7 +50,6 @@ case "$host_os" in
|
2018-07-26 19:15:23 +02:00
|
|
|
;;
|
|
|
|
darwin*)
|
|
|
|
CFLAGS="$CFLAGS -no-cpp-precomp -fno-common"
|
|
|
|
- CLDFLAGS="$CLDFLAGS"
|
|
|
|
ELDFLAGS=
|
|
|
|
CLDWHOLEARCHIVE="-all_load"
|
|
|
|
CLDNOWHOLEARCHIVE=
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -1656,6 +1653,31 @@ package as well (which may be called readline-devel or something similar).])
|
2018-07-26 19:15:23 +02:00
|
|
|
LIBS=$lvm_saved_libs
|
|
|
|
fi
|
|
|
|
|
|
|
|
+################################################################################
|
|
|
|
+dnl -- Symbol versioning
|
|
|
|
+AC_MSG_CHECKING(whether to enable symbol versioning)
|
|
|
|
+AC_ARG_ENABLE(symvers,
|
|
|
|
+ AC_HELP_STRING([--enable-symvers[[[=STYLE]]]],
|
|
|
|
+ [enables symbol versioning of the shared library [default=gnu]]),
|
|
|
|
+ [
|
|
|
|
+ case "$enableval" in
|
|
|
|
+ gnu|no) ;;
|
|
|
|
+ *) AC_MSG_ERROR(Unknown argument to enable/disable symvers) ;;
|
|
|
|
+ esac],
|
|
|
|
+ enable_symvers=gnu)
|
|
|
|
+AC_MSG_RESULT($enable_symvers)
|
|
|
|
+
|
|
|
|
+if test x$GCC = xyes && test x$enable_symvers = xgnu ; then
|
|
|
|
+ AC_DEFINE(GNU_SYMVER, 1,
|
|
|
|
+ [Define to use GNU versioning in the shared library.])
|
|
|
|
+ case "$host_os" in
|
|
|
|
+ linux*)
|
|
|
|
+ CLDFLAGS="$CLDFLAGS -Wl,--version-script,.export.sym"
|
|
|
|
+ LDDEPS="$LDDEPS .export.sym"
|
|
|
|
+ ;;
|
|
|
|
+ esac
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
################################################################################
|
|
|
|
dnl -- Internationalisation stuff
|
|
|
|
AC_MSG_CHECKING(whether to enable internationalisation)
|
|
|
|
diff --git a/include/configure.h.in b/include/configure.h.in
|
2018-07-26 19:15:24 +02:00
|
|
|
index 15fd150ed..7a07a10ef 100644
|
2018-07-26 19:15:23 +02:00
|
|
|
--- a/include/configure.h.in
|
|
|
|
+++ b/include/configure.h.in
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -147,6 +147,9 @@
|
2018-07-26 19:15:23 +02:00
|
|
|
/* 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
|
2018-07-26 19:15:24 +02:00
|
|
|
index d7fa5c721..7cf98f932 100644
|
2018-07-26 19:15:23 +02:00
|
|
|
--- a/lib/misc/lib.h
|
|
|
|
+++ b/lib/misc/lib.h
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -41,16 +41,16 @@
|
2018-07-26 19:15:23 +02:00
|
|
|
* 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)
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -67,7 +67,7 @@
|
2018-07-26 19:15:23 +02:00
|
|
|
* 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
|
2018-07-26 19:15:24 +02:00
|
|
|
index 769b69c1b..28e2eadee 100644
|
2018-07-26 19:15:23 +02:00
|
|
|
--- a/libdm/ioctl/libdm-iface.c
|
|
|
|
+++ b/libdm/ioctl/libdm-iface.c
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -2145,7 +2145,7 @@ void dm_lib_exit(void)
|
2018-07-26 19:15:23 +02:00
|
|
|
_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
|
2018-07-26 19:15:24 +02:00
|
|
|
index ab0545659..00651c0b2 100644
|
2018-07-26 19:15:23 +02:00
|
|
|
--- a/libdm/libdm-deptree.c
|
|
|
|
+++ b/libdm/libdm-deptree.c
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -3797,7 +3797,7 @@ void dm_tree_node_set_callback(struct dm_tree_node *dnode,
|
2018-07-26 19:15:23 +02:00
|
|
|
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
|
2018-07-26 19:15:24 +02:00
|
|
|
index 94ad380e0..76efbbe35 100644
|
2018-07-26 19:15:23 +02:00
|
|
|
--- a/libdm/libdm-stats.c
|
|
|
|
+++ b/libdm/libdm-stats.c
|
2018-07-26 19:15:24 +02:00
|
|
|
@@ -5065,7 +5065,7 @@ int dm_stats_start_filemapd(int fd, uint64_t group_id, const char *path,
|
2018-07-26 19:15:23 +02:00
|
|
|
* 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
|
|
|
|
|