From: Francis Deslauriers Date: Tue, 4 Sep 2018 21:05:14 +0000 (-0400) Subject: Move symbol preventing unloading of probe providers X-Git-Tag: v2.11.0-rc1~2 X-Git-Url: http://git.liburcu.org/?a=commitdiff_plain;h=0fd0de100bc6633e8ecf575301dc92321db32575;hp=0fd0de100bc6633e8ecf575301dc92321db32575;p=lttng-ust.git Move symbol preventing unloading of probe providers Issue ===== Calling dlclose on the probe provider library that first loaded __tracepoints__disable_destructors in the symbol table does not unregister the probes from the callsites as the destructors are not executed. The __tracepoints__disable_destructors weak symbol is exposed by probe providers, liblttng-ust.so and liblttng-ust-tracepoint.so libraries. If a probe provider is loaded first into the address space, its definition is bound to the symbol. All the subsequent loaded libraries using the symbol will use the existing definition of the symbol, thus creating a situation where liblttng-ust.so or liblttng-ust-tracepoint.so depend on the probe provider library. This prevents the dynamic loader from unloading the library as it is still in use by other libraries. Because of this, the execution of its destructors and the unregistration of the probes is postponed. Since the unregistration of the probes is postponed, event will be generated if the callsite is executed even though the probes should not be loaded. Solution ======== To overcome this issue, we no longer expose this symbol in the tracepoint.h file to remove the explicit dependency of the probe provider on the symbol. We instead use the existing dlopen handle on liblttng-ust-tracepoint.so and use dlsym to get handles on functions that disable and get the state of the destructors. Version compatibility ===================== - This change is backward compatible with UST applications and libraries built on lttng-ust version before 2.11. Those applications will use the __tracepoints__disable_destructors symbol that is now exposed as a weak symbol in the liblttng-ust-tracepoint.so library. This symbol is alway checked in 2.11 in case an old app is running. - Applications built with this change will also work in older versions of lttng-ust as there is a check to see if the new destructor state checking method should be used, if it is not we fallback to a compatibility method. To ensure compatibility in this case, we also look up and keep up-to-date the __tracepoints__disable_destructors value using the dlopen-dlsym combo. - A mix of applications/probes builds in part against 2.10 and 2.11 also work. When setting the destructor state from a binary built against 2.11 headers, both old/new states are set, so a binary built against 2.10 will correctly see the old state. When querying the state from a binary built against 2.11 headers, both old and new states are queried, so if the state has been set from a binary built against 2.10 headers, the old state will be set. Signed-off-by: Francis Deslauriers Signed-off-by: Mathieu Desnoyers ---