__cyg_profile_func_enter is not called with correct address ?

robert song robertsong.linux@gmail.com
Fri Feb 27 06:44:00 GMT 2009


2009/2/27 Andrew Haley <aph@redhat.com>:
>  robert song wrote:
>> Andrew, thank you for your reply.
>> Well, the source file can be modified to solve the problem, but I want
>> to use one tool to record every address of the running applications
>> built with -finstrument-sections option, without modifying the
>> application source code itself.
>
> Try this:
>
> void
> __cyg_profile_func_enter (void *this_fn, void *call_site)
> {
>  Dl_info info;
>  dladdr(__builtin_return_address(0), &info);
>

It is a good idea to use __builtin_return_address(0) which will be located
between the caller funtion start and end address.

Thank you very much.

besh wishes,
robert

>  printf ("addr:%lx %p:%s\n", this_fn, info.dli_saddr, info.dli_sname);
> }
>
> Link with -ldl.
>
>
>> But now the address sometimes may be the PLT address of the application,
>> and I don't have a good idea to deal with the problem.
>>
>> If the real address can be got in the  __cyg_profile_func_enter()
>> function in some way, it will be helpful to analyse.
>>
>> 2009/2/26 Andrew Haley <aph@redhat.com>:
>>> The shared library loader is trying to make the code as efficient as possible.
>>> When you take the address of a symbol in main, the loader is forced to fix up
>>> the reloc with a pointer into the PLT.  This happens because at the time the
>>> fixup is made, the symbol foo has not been resolved: it'll only be resolved
>>> later when the first call to foo happens.  So, we have to use the PLT address
>>> because we don't yet know where foo is.
>>>
>>> Because of C's rule that the address of a function must be unique, every subsequent
>>> reference to that symbol will return the PLT address, including the one used
>>> in the call to __cyg_profile_func_enter().
>>>
>>> You can get around this by compiling main with -fpic and not globally initializing
>>> ptr.
>>>
>>> void *ptr;
>>>
>>> int
>>> main (int argc, char *argv[])
>>> {
>>>  ptr = foo;
>>>
>>> cc -fpic -finstrument-functions -g -o main main.c tracer.c foo.so -Wl,-rpath `pwd`
>>>
>>>  $  ./main
>>> addr:40073c
>>> addr:110634
>>> addr:110634
>>> addr:11066b
>>> addr:11066b
>>> addr:40073c
>>>
>>> Andrew.
>>>
>>>
>
>



More information about the Gcc-help mailing list