On 9/25/18 12:21 AM, Alexander Monakov wrote:
> Hello,
>
> Here's the promised "libgcov summary"; sorry about the delay.
Thank you Alexander, I take it as productive discussion starting point.
>
> So libgcov has a bit unusual design where:
>
> - on the one hand, the library is static-only, has PIC code and may be
> linked
> into shared libraries,
>
> - almost all gcov symbols have "hidden" visibility so they don't participate
> in dynamic linking
>
> - on the other hand, the __gcov_master symbol deliberately has default
> visibility, presumably with the intention that a running program has
> exactly
> one instance of this symbol, although the exact motivation is unclear to
> me.
The only usage I see right now is support of __gcov_reset, __gcov_dump function.
Which in my opinion should cover all loaded DSOs in an executable.
>
> This latter point does not reliably work as intended though: there are
> scenarios
> where a dynamically linked program will have multiple __gcov_masters anyway:
>
> - via repeated dlopen(RTLD_LOCAL) with main executable not linked against
> libgcov
> or not exporting libgcov symbols (as in PR 83879)
Here we have a work-around: --dynamic-list-data.
> - when shared libraries have version scripts that hide their __gcov_master
> - when -Bsymbolic is in effect
>
>
> Additionally, indirect call profiling symbols are not hidden either, and that
> leads to extra complications. Since there are multiple symbols, during dynamic
> linking they may be partially interposed. PR 84107 demonstrates how this leads
> to libgcov segfaulting in a fairly simple and legitimate program.
For this one, we have a working work-around:
https://gcc.gnu.org/ml/gcc-patches/2018-09/msg00961.html
>
> Bottom line: static linking code with default-visibility symbols
> into shared libraries is problematic.
>
> So one strategy is to ensure all gcov symbols have hidden visibility. That
> would
> isolate gcov instances in each shared library loaded in the program, and each
> library would have the responsibility to write out its counters when unloaded.
> Also, __gcov_dump would dump only the counters specific to the current
> library.
>
> I may be missing something here so it might be nice to unearth why exactly
> __gcov_master is intended to be global.
>
> Another strategy is to introduce libgcov.so and have it host either all
> libgcov
> symbols or just those that by design are required to exist once in the
> program.
>
> When talking to Richi at the Cauldron I got the impression he'd question if
> shared libgcov is worth the cost, e.g. would it make any easier for users to
> mix two libraries, one linked against older libgcov, and another with a newer
> (something that doesn't work at all now, but would be nice to support if I
> understood Richard correctly).
>
> Alexander
>
Note that I'm fan of the shared library. I actually prepared working patch for
that.
So my strategy would be to first install the suggested patch:
https://gcc.gnu.org/ml/gcc-patches/2018-09/msg00961.html
and then we Richi is fine, we can also add the shared library patch.
Martin