summaryrefslogtreecommitdiff
path: root/libdm/misc
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2021-04-03 21:49:37 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2021-04-06 21:26:57 +0200
commita8480f0f6e2585a66fb0a9e25135fde8fb11d997 (patch)
treeb9c8eb51815292ed54ef9ef9be8c079a2b37af73 /libdm/misc
parent12949ea886259ead84597a1d4de37c8715d8edb7 (diff)
downloadlvm2-a8480f0f6e2585a66fb0a9e25135fde8fb11d997.tar.gz
libdm: symbol versioning with -flto
Gcc10 introduced different strategy how to build shared libraries with their new LTO optimizer. Insired by: https://akkadia.org/drepper/symbol-versioning https://sourceware.org/pipermail/elfutils-devel/attachments/20200414/1c0c2903/attachment.bin https://github.com/InBetweenNames/gentooLTO/issues/459 https://github.com/linux-rdma/rdma-core/blob/master/util/symver.h https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48200
Diffstat (limited to 'libdm/misc')
-rw-r--r--libdm/misc/dmlib.h27
1 files changed, 22 insertions, 5 deletions
diff --git a/libdm/misc/dmlib.h b/libdm/misc/dmlib.h
index 85a22c50f..95f4b8ecb 100644
--- a/libdm/misc/dmlib.h
+++ b/libdm/misc/dmlib.h
@@ -22,6 +22,7 @@
/*
* Symbol export control macros
*
+ * DM_EXPORT_NEW_SYMBOL(rettype, func, ver)
* DM_EXPORT_SYMBOL(func,ver)
* DM_EXPORT_SYMBOL_BASE(func,ver)
*
@@ -40,19 +41,19 @@
* compatibility version should be enclosed in '#if defined(GNU_SYMVER)',
* for example:
*
- * int dm_foo(int bar)
+ * DM_EXPORT_NEW_SYMBOL(int, dm_foo, 1_02_107)(int bar)
* {
* return bar;
* }
*
- * #if defined(__GNUC__)
+ * #if defined(GNU_SYMVER)
* // Backward compatible dm_foo() version 1.02.104
+ * DM_EXPORT_SYMBOL(dm_foo,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
@@ -63,11 +64,27 @@
* versioning: it must never be used for new symbols.
*/
#if defined(GNU_SYMVER)
+# ifdef __has_attribute
+# if __has_attribute(symver)
+# define DM_EXPORT_NEW_SYMBOL(rettype, func, ver) \
+ __attribute__((__symver__( #func "@@DM_" #ver ))) \
+ __typeof__(func) func ##_v ##ver; \
+ rettype func ##_v ##ver
+# define DM_EXPORT_SYMBOL(func, ver) \
+ __attribute__((__symver__( #func "@DM_" #ver )))
+# define DM_EXPORT_SYMBOL_BASE(func) \
+ __attribute__((__symver__( #func "@Base" )))
+# endif
+# endif
+#ifndef DM_EXPORT_NEW_SYMBOL
+#define DM_EXPORT_NEW_SYMBOL(rettype, func, ver) rettype func
#define DM_EXPORT_SYMBOL(func, ver) \
- __asm__(".symver " #func "_v" #ver ", " #func "@DM_" #ver )
+ __asm__(".symver " #func "_v" #ver ", " #func "@DM_" #ver );
#define DM_EXPORT_SYMBOL_BASE(func) \
- __asm__(".symver " #func "_base, " #func "@Base" )
+ __asm__(".symver " #func "_base, " #func "@Base" );
+#endif
#else
+#define DM_EXPORT_NEW_SYMBOL(rettype, func, ver) rettype func
#define DM_EXPORT_SYMBOL(func, ver)
#define DM_EXPORT_SYMBOL_BASE(func)
#endif