Some OpenEmbedded GCC releases (namely 4.7.2) incorrectly emit those symbols with default visibility if both weak and hidden attributes are used. When tracepoints are distributed among the main application and one or several shared objects (e.g. lttng_ust_tracef:event in liblttng-ust.so AND your own tracepoint provider, statically or dynamically linked), this results in a subtle name clash at runtime, causing only the tracepoints from one particular binary to be active, silently breaking all others. These symbols are indeed only declared and need not be defined (contrary to __tracepoint_registered and friends), as they are automatically PROVIDE-d by the linker as pointers to the "_tracepoint_ptrs" orphaned section.
So even though the issue is only observed with a buggy compiler, removing the weak attribute also enforces the correct strong linking to the symbols provided by the linker (which would otherwise, by weak semantics, default to a value of all-zeroes). References: https://gcc.gnu.org/ml/gcc-help/2014-05/msg00005.html References: http://lists.lttng.org/pipermail/lttng-dev/2014-May/023090.html Reported-by: Martin Ünsal <[email protected]> Thanks-to: Henrik Wallin <[email protected]> Cc: Paul Woegerer <[email protected]> Signed-off-by: Gerlando Falauto <[email protected]> --- include/lttng/tracepoint.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index c5a09d8..229ea72 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -308,14 +308,19 @@ __tracepoints__destroy(void) #ifdef TRACEPOINT_DEFINE /* - * These weak symbols, the constructor, and destructor take care of - * registering only _one_ instance of the tracepoints per shared-ojbect - * (or for the whole main program). + * These strong hidden symbols are automatically provided by the linker + * for each shared-object (or for the whole main program) as pointers + * to the orphaned section "_tracepoints_ptrs" and must not be visible + * from other shared objects to avoid name clashes at runtime which would + * silently enable only the tracepoints from the object loaded first. + * NOTICE: Some OpenEmbedded GCC releases (namely 4.7.2) incorrectly + * emit those symbols with default visibility if both weak and hidden + * are used. */ extern struct tracepoint * const __start___tracepoints_ptrs[] - __attribute__((weak, visibility("hidden"))); + __attribute__((visibility("hidden"))); extern struct tracepoint * const __stop___tracepoints_ptrs[] - __attribute__((weak, visibility("hidden"))); + __attribute__((visibility("hidden"))); /* * When TRACEPOINT_PROBE_DYNAMIC_LINKAGE is defined, we do not emit a -- 1.8.0.1 _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
