+extern int __tracepoint_probe_register(const char *name, void *func, void *data,
+ const char *signature);
+extern int __tracepoint_probe_unregister(const char *name, void *func, void *data);
+
+/*
+ * tracepoint dynamic linkage handling (callbacks). Hidden visibility:
+ * shared across objects in a module/main executable.
+ */
+struct tracepoint_dlopen {
+ void *liblttngust_handle;
+
+ int (*tracepoint_register_lib)(struct tracepoint * const *tracepoints_start,
+ int tracepoints_count);
+ int (*tracepoint_unregister_lib)(struct tracepoint * const *tracepoints_start);
+#ifndef _LGPL_SOURCE
+ void (*rcu_read_lock_sym_bp)(void);
+ void (*rcu_read_unlock_sym_bp)(void);
+ void *(*rcu_dereference_sym_bp)(void *p);
+#endif
+};
+
+extern struct tracepoint_dlopen tracepoint_dlopen;
+
+#ifdef TRACEPOINT_DEFINE
+
+/*
+ * When TRACEPOINT_PROBE_DYNAMIC_LINKAGE is defined, we do not emit a
+ * unresolved symbol that requires the provider to be linked in. When
+ * TRACEPOINT_PROBE_DYNAMIC_LINKAGE is not defined, we emit an
+ * unresolved symbol that depends on having the provider linked in,
+ * otherwise the linker complains. This deals with use of static
+ * libraries, ensuring that the linker does not remove the provider
+ * object from the executable.
+ */
+#ifdef TRACEPOINT_PROBE_DYNAMIC_LINKAGE
+#define _TRACEPOINT_UNDEFINED_REF(provider) NULL
+#else /* TRACEPOINT_PROBE_DYNAMIC_LINKAGE */
+#define _TRACEPOINT_UNDEFINED_REF(provider) &__tracepoint_provider_##provider
+#endif /* TRACEPOINT_PROBE_DYNAMIC_LINKAGE */
+