Pb when calling a nested function in the inferior

Joel Brobecker brobecker@act-europe.fr
Tue Jul 31 00:24:00 GMT 2001


> Have you verified that the mechanisms used by gcc and by Ada95 for
> passing the static chain are the same?

Yes. Actually, the code was exactly the same.

>     1) In the version of gcc that I'm using the symbol that's associated
>        with get_value() is get_value.0.  You could look for such symbols
>        and refuse to allow them to be called as inferior functions.

this suggestion has my preference, being more general than the
suggestion below. Let me check it out.

>     2) You could scan the prologue and look for a sequence of instructions
>        which looks like a save of the static chain.  E.g, in your example,
>        I see:
> 
> 	0x804842c <get_value.0>:        push   %ebp
> 	0x804842d <get_value.0+1>:      mov    %esp,%ebp
> 	0x804842f <get_value.0+3>:      sub    $0x4,%esp
> 	0x8048432 <get_value.0+6>:      mov    %ecx,0xfffffffc(%ebp)
> 	0x8048435 <get_value.0+9>:      mov    0xfffffffc(%ebp),%ecx
> 	0x8048438 <get_value.0+12>:     mov    %ecx,%ecx
> 	0x804843a <get_value.0+14>:     mov    0xfffffffc(%ecx),%eax
> 	0x804843d <get_value.0+17>:     mov    %eax,%eax
> 	0x804843f <get_value.0+19>:     leave  
> 	0x8048440 <get_value.0+20>:     ret    
> 
>        It appears to me that ``mov %ecx,0xfffffffc(%ebp)'' is
>        responsible for saving the static chain pointer.  If you could
>        detect this, you could print your error or warning.  (You'd
>        want to make sure that no other instruction with a destination
>        of %ecx appears before this instruction in the prologue though;
>        if it does, it means it's doing something else.)
> 
> BTW, GDB isn't particularly graceful in its handling of the ``get_value.0''
> symbol.  E.g, observe what happens when I do ``x/i get_value.0'':
> 
>     (gdb) x/i get_value.0
>     No symbol "get_value" in current context.

That's curious. With my version of gdb, I don't get the same result
(using GNU gdb 2001-07-30-cvs (MI_OUT)):
    (gdb) x/10i get_value.0
    A parse error in expression, near `'.
    (gdb) x/4i get_value
    0x8048468 <get_value>:  push   %ebp
    0x8048469 <get_value+1>:        mov    %esp,%ebp
    0x804846b <get_value+3>:        sub    $0x4,%esp
    0x804846e <get_value+6>:        mov    %ecx,0xfffffffc(%ebp)

-- 
Joel



More information about the Gdb-patches mailing list