Move symbol preventing unloading of probe providers
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Tue, 4 Sep 2018 21:05:14 +0000 (17:05 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 5 Sep 2018 16:19:23 +0000 (12:19 -0400)
commit0fd0de100bc6633e8ecf575301dc92321db32575
tree71a2a3c75600c38ecbd9cca9fae22c45b078b69c
parent74df66ac7275d3452038d294fc6088cb5505e0a2
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 <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/lttng/tracepoint.h
liblttng-ust/tracepoint.c
This page took 0.025858 seconds and 5 git commands to generate.