summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_private.h
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2006-03-13 00:59:51 +0000
committerdeischen <deischen@FreeBSD.org>2006-03-13 00:59:51 +0000
commitcc69a08fbfbd64dd13ebb80b18cc83824a3c8781 (patch)
tree0ff38bc0c45640883ff06a668902f099c9ff8641 /lib/libpthread/thread/thr_private.h
parent11cbb2f2752487f0605f14afcc37e520331c8dbc (diff)
downloadFreeBSD-src-cc69a08fbfbd64dd13ebb80b18cc83824a3c8781.zip
FreeBSD-src-cc69a08fbfbd64dd13ebb80b18cc83824a3c8781.tar.gz
Add compatibility symbol maps. libpthread (.so.1 and .so.2)
used LIBTHREAD_1_0 as its version definition, but now needs to define its symbols in the same namespace used by libc. The compatibility hooks allows you to use libraries and binaries built and linked to libpthread before libc was built with symbol versioning. The shims can be removed if libpthread is given a version bump. Reviewed by: davidxu
Diffstat (limited to 'lib/libpthread/thread/thr_private.h')
-rw-r--r--lib/libpthread/thread/thr_private.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/libpthread/thread/thr_private.h b/lib/libpthread/thread/thr_private.h
index 9d8ee63..9d58078 100644
--- a/lib/libpthread/thread/thr_private.h
+++ b/lib/libpthread/thread/thr_private.h
@@ -60,6 +60,40 @@
#endif
/*
+ * Unfortunately, libpthread had symbol versioning before libc.
+ * But now libc has symbol versioning, we need to occupy the
+ * same version namespace in order to override some libc functions.
+ * So in order to avoid breaking binaries requiring symbols from
+ * LIBTHREAD_1_0, we need to provide a compatible interface for
+ * those symbols.
+ */
+#if defined(SYMBOL_VERSIONING) && defined(PIC)
+#define SYM_LT10(sym) __CONCAT(sym, _lt10)
+#define SYM_FB10(sym) __CONCAT(sym, _fb10)
+#define SYM_FBP10(sym) __CONCAT(sym, _fbp10)
+#define WEAK_REF(sym, alias) __weak_reference(sym, alias)
+#define SYM_COMPAT(sym, impl, ver) __sym_compat(sym, impl, ver)
+#define SYM_DEFAULT(sym, impl, ver) __sym_default(sym, impl, ver)
+
+#define LT10_COMPAT(sym) \
+ WEAK_REF(sym, SYM_LT10(sym)); \
+ SYM_COMPAT(sym, SYM_LT10(sym), LIBTHREAD_1_0)
+
+#define LT10_COMPAT_DEFAULT(sym) \
+ LT10_COMPAT(sym); \
+ WEAK_REF(sym, SYM_FB10(sym)); \
+ SYM_DEFAULT(sym, SYM_FB10(sym), FBSD_1.0)
+
+#define LT10_COMPAT_PRIVATE(sym) \
+ LT10_COMPAT(sym); \
+ WEAK_REF(sym, SYM_FBP10(sym)); \
+ SYM_DEFAULT(sym, SYM_FBP10(sym), FBSDprivate)
+#else
+#define LT10_COMPAT_DEFAULT(sym)
+#define LT10_COMPAT_PRIVATE(sym)
+#endif
+
+/*
* Evaluate the storage class specifier.
*/
#ifdef GLOBAL_PTHREAD_PRIVATE
OpenPOWER on IntegriCloud