summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/shlib-compat.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/include/shlib-compat.h b/include/shlib-compat.h
index f1c2fd8ed9..fafb5268a6 100644
--- a/include/shlib-compat.h
+++ b/include/shlib-compat.h
@@ -64,6 +64,41 @@
# define compat_symbol(lib, local, symbol, version) \
compat_symbol_reference (lib, local, symbol, version)
+/* This is similar to compat_symbol, but allows versioning the same symbol
+ to multiple version without having multiple symbol definitions. For
+ instance:
+
+ #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2))
+ compat_symbol_unique (libc, old_foo, GLIBC_2_1_2)
+ #endif
+
+ #if (SHLIB_COMPAT (libpthread, GLIBC_2_2_6, GLIBC_2_3))
+ compat_symbol_unique (libc, old_foo, GLIBC_2_2_6)
+ #endif
+
+ Internally it creates a unique strong alias to the input symbol and
+ creates one compat_symbol on the alias. Using the above example,
+ it is similar to:
+
+ #if (SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_2))
+ strong_alias (old_foo, old_foo__COUNTER__)
+ compat_symbol (libc, old_foo__COUNTER__, foo, GLIBC_2_2)
+ #endif.
+
+ With __COUNTER__ being a monotonic number generated by the compiler. */
+
+# define __compat_symbol_unique_concat(x, y) x ## y
+# define _compat_symbol_unique_concat(x, y) \
+ __compat_symbol_unique_concat (x, y)
+# define _compat_symbol_unique_alias(name) \
+ _compat_symbol_unique_concat (name, __COUNTER__)
+# define _compat_symbol_unique(lib, orig_name, name, version) \
+ strong_alias (orig_name, name) \
+ compat_symbol (lib, name, orig_name, version)
+# define compat_symbol_unique(lib, name, version) \
+ _compat_symbol_unique (lib, name, _compat_symbol_unique_alias (name), \
+ version)
+
#else
/* Not compiling ELF shared libraries at all, so never any old versions. */
@@ -75,6 +110,7 @@
/* This should not appear outside `#if SHLIB_COMPAT (...)'. */
# define compat_symbol(lib, local, symbol, version) ...
+# define compat_symbol_unique(lib, name, version) ...
#endif