Re: LTTng unfriendly with mixed static/dynamic linking

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I tried all solutions, and it looks like only #1 works.  #2 gives the
error "/usr/bin/ld: main: hidden symbol `tracepoint_dlopen' in
common_tp.a(common_tp.o) is referenced by DSO" when linking.  #3 gives
the error "./liblibrary.so: undefined reference to
`tracepoint_dlopen'" when linking.  (Linking is complicated by the
fact that LTTng uses special symbol attributes, and tracepoint_dlopen
happens to be weak and hidden.)  Unless I'm mistaken (and I very well
may be), we will have to ensure that all traced code is either 1)
placed in a shared library and never statically linked elsewhere, or
2) never linked into any shared library.

Thoughts?

Adam

On Fri, Jul 25, 2014 at 11:48 AM, Adam Crume <adamcrume@xxxxxxxxx> wrote:
> 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-sol1.tar.gz
Description: GNU Zip compressed data

Attachment: lttng-duplicate-tracepoints-sol2.tar.gz
Description: GNU Zip compressed data

Attachment: lttng-duplicate-tracepoints-sol3.tar.gz
Description: GNU Zip compressed data


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux