LTTng requires tracepoints to be linked into a program only once. If tracepoints are linked in multiple times, the program crashes at startup with: "LTTng-UST: Error (-17) while registering tracepoint probe. Duplicate registration of tracepoint probes having the same name is not allowed." This is problematic when mixing static and dynamic linking. If the tracepoints are in a static library, that library can end up in an executable multiple times by being linked in directly, as well as being statically linked into a dynamic library. Even if the tracepoints are not linked directly into the executable, they can be statically linked into multiple dynamic libraries that the executable loads. For us, this problem shows up with libcommon, and could show up with others such as libosd. (In general, I think anything added to noinst_LTLIBRARIES is static, and anything added to lib_LTLIBRARIES is dynamic.) There are a few ways of solving the issue: 1. Change every library that has tracepoints, like libcommon, from static to dynamic. This could be a big change, as at the very least we'd have to rename the library to something like libceph_common to avoid conflicts, since now it would be an installed file. This has the advantage of keeping code and its tracepoints in the same library. 2. Keep tracepoints in a separate static library. For example, libcommon and libcommon_tp. Unfortunately, every executable (but not library!) that links in libcommon (directly or indirectly) would have to manually link in libcommon_tp, and I don't think Automake could automate that. 3. Keep tracepoints in a separate dynamic library. In this case, I think libcommon could depend on libcommon_tp, so executables would not have to manually link in libcommon_tp. (I'm not an Automake expert, so let me know if I'm wrong on that.) Again, libcommon_tp would be an installed file, so we'd want to rename it to something like libceph_common_tp. I attached a minimal test case of the problem. Thoughts or suggestions? Thanks, Adam Crume
Attachment:
lttng-duplicate-tracepoints.tar.gz
Description: GNU Zip compressed data