building kernel with -O
Peter Teoh
htmldeveloper at gmail.com
Wed Jul 30 22:40:27 EDT 2014
If function is built with framepointer, then EBP + 4 == return address of
the caller of then present function. Because by convention, the entire
function usually don't touch the EBP's value, so with respect to that, u
can always retrieve the return address of the caller. (which is what this
function does).
and u ask if is not compiled inline? Then __builtin_return_address()
become a function itself? Then u are getting the caller of
"__builtin_return_address". That was not the original intention. Its
purpose is to get the caller address of the current function.
On Thu, Jul 31, 2014 at 9:05 AM, Xin Tong <trent.tong at gmail.com> wrote:
> In that case, the __builtin_return_address(level) level > 1 is not
> possible either ? what if the kernel uses this ?
>
> Xin
>
>
> On Wed, Jul 30, 2014 at 8:00 PM, Peter Teoh <htmldeveloper at gmail.com>
> wrote:
>
>>
>>
>>
>> On Thu, Jul 31, 2014 at 12:59 AM, Xin Tong <trent.tong at gmail.com> wrote:
>>
>>> why can not __builtin_return_address() be made *never* inline and use
>>> current level+1 to get the return address of the function of interest. For
>>> any stack introspection, having 1 more level will not hurt functionality.
>>>
>>
>> Actually, the answer for your remark is "impossible" - in the case when
>> the kernel is compiled without frame pointer. (CONFIG_FRAME_POINTER=n)
>> which is true for certain variant of RHEL / CentOS. Without the
>> availability of EBP on the stack, there is no way to know when to stop
>> reading the stack to retrieve the previous stackframe. Of course u can
>> statically walk the disassembly of the function and see how much stack
>> space the particular function has allocated. But that requires
>> implementing a disassembler in the kernel.
>>
>>
>>
>>>
>>> given its explanation below
>>>
>>> — Built-in Function: void * *__builtin_return_address* (unsigned int
>>> level)
>>>
>>> This function returns the return address of the current function, or of
>>> one of its callers. The level argument is number of frames to scan up
>>> the call stack. A value of 0 yields the return address of the current
>>> function, a value of 1 yields the return address of the caller of the
>>> current function, and so forth. When inlining the expected behavior is that
>>> the function returns the address of the function that is returned to. To
>>> work around this behavior use the noinline function attribute.
>>>
>>>
>>>
>>>
>>
>> --
>> Regards,
>> Peter Teoh
>>
>
>
--
Regards,
Peter Teoh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20140731/4be700e1/attachment-0001.html
More information about the Kernelnewbies
mailing list