diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2021-04-03 21:49:37 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2021-04-06 21:26:57 +0200 |
commit | a8480f0f6e2585a66fb0a9e25135fde8fb11d997 (patch) | |
tree | b9c8eb51815292ed54ef9ef9be8c079a2b37af73 /libdm/misc | |
parent | 12949ea886259ead84597a1d4de37c8715d8edb7 (diff) | |
download | lvm2-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.h | 27 |
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 |