On 05/03/2013 08:35 PM, Mathieu Desnoyers wrote:
> * Woegerer, Paul (paul_woege...@mentor.com) wrote:
>> Without this change the user simply cannot make sure its own
>> constructor gets invoked after the trace provider constructors.
> 
> If we try to support tracing constructors, I'm concerned that with this
> change (using priority):
> 1 - we lose in terms of portability (not all gcc versions support the
> priority argument,
> 2 - there can be corner-cases that won't honor the priority.
> 
> We should thoroughly test and document the effect of priority in cases
> of:
> 
> - multiple .o linked into an executable,
> - multiple .o linked into a .a, statically linked (does not honor
>   constructors at all),
> - multiple .o linked into a .so, many .so linked,
> 
> And figure out if the ordering of constructor is OK with each of those
> cases.

You are right. Using the priority construct might cause more problems
than it solves.

A pragmatic solution to the above problem would be to provide a special
documented function (as part of man:lttng-ust) that allows the user to
ensure that the static constructors (withing the same "dynamic linker
unit" (.so or exe)) used by lttng-ust have been executed successfully.
Something like:

void ensure_lttng_ust_init_completed();

If the trace provider constructors have been invoked already the
function simply returns otherwise it invokes them explicitly and makes
sure that a later invocation by the dynamic linker will not have any effect.

> 
>>
>>>> And even if this is not the case I could explicitly dlopen the probe
>>>> shared object from within my constructor function and thus make sure
>>>> that the constructor function of the probe shared object gets called
>>>> before I emit an event from my constructor function.
>>>
>>> The idea would be to provide a nice API to facilitate this use-case, and
>>> document it in the instrumentation guide-lines (lttng-ust(3)).
>>
>> Therefore we would need to reliably deduce the tracepoint provider
>> shared library name from the header file that defines it. Since C/C++
>> has no package concept and gives you the freedom to name your shared
>> library whatever you like it seems to be hard to get there.
> 
> indeed,
> 
>>
>> One way to deal with it would be to extend the lttng-gen-tp tool
>> directly build the tracepoint provider shared library instead of just
>> outputting the generated .c .h files.
> 
> But then we'd _require_ that people use .so for providers. They might
> want to just pull the probe provider into their executable.
> 
>> This way the shared library name
>> would be controlled by lttng-gen-tp tool and an autogenerated macro
>> (e.g. ensure_tracepoints_init()) in the generated .h file could provide
>> the dlopen code to explicitly load the tracepoint provider shared
>> library if needed.
> 
> Would this work fine with your constructor instrumentation use-case ?
> Is the order of constructors across .so files guaranteed in any way ?

Only if we use dlopen *exclusively* and do not rely on any linker
induced shared object loading (-lfoo -lbar) anymore we would have full
control over the order of execution.

--Paul

> 
> Thanks,
> 
> Mathieu
> 
>>
>> Thanks,
>> Paul
>>
>>
>> -- 
>> Paul Woegerer | SW Development Engineer
>> http://go.mentor.com/sourceryanalyzer
>>
>> Mentor Embedded(tm) | Prinz Eugen Straße 72/2/4, Vienna, 1040 Austria
>> Nucleus® | Linux® | Android(tm) | Services | UI | Multi-OS
>>
>> Android is a trademark of Google Inc. Use of this trademark is subject
>> to Google Permissions.
>> Linux is the registered trademark of Linus Torvalds in the U.S. and
>> other countries.
> 


-- 
Paul Woegerer | SW Development Engineer
http://go.mentor.com/sourceryanalyzer

Mentor Embedded(tm) | Prinz Eugen Straße 72/2/4, Vienna, 1040 Austria
Nucleus® | Linux® | Android(tm) | Services | UI | Multi-OS

Android is a trademark of Google Inc. Use of this trademark is subject
to Google Permissions.
Linux is the registered trademark of Linus Torvalds in the U.S. and
other countries.

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to