Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Andrew Cagney <cagney@gnu.org>
To: Randolph Chung <randolph@tausq.org>
Cc: gdb@sources.redhat.com
Subject: Re: [patch/rfc] How to handle stepping into an unresolved plt entry?
Date: Fri, 21 May 2004 16:00:00 -0000	[thread overview]
Message-ID: <40AE27AC.6090205@gnu.org> (raw)
In-Reply-To: <20040521064435.GJ566@tausq.org>

> On hppa, I noticed that when I do a "step" over an indirect function
> call, gdb does not stop inside the called function.  I've traced the
> problem down to the following:
> 
> An indirect function call on hppa goes through a stub ($$dyncall).
> $$dyncall loads a PLABEL from the PLT and jumps to it. In the case that
> the PLT is not yet resolved, we need to do the normal PLT fixup () in 
> the loader before calling the function.
> 
> What seems to be happening now is that when a "step" happens at the
> indirect function call, we step into the $$dyncall stub, and in
> infrun.c, we do a SKIP_TRAMPOLINE_CODE. This resolves into a pc that
> points at the fixup routine. Next, in handle_inferior_event (), we try
> to lookup the file/line information for this target pc; it's not found,
> and so gdb just goes ahead and insert a breakpoint at the return address
> of the stub (which is in the caller) and then calls keep_going ().
> If we do a step on a second invocation of the indirect function call, it
> works correctly; SKIP_TRAMPOLINE_CODE resolves to an address that points
> to the target function, so the file/line lookup works and we insert a
> breakpoint in the right place.

Hmm, should gdb put a greater reliance on SKIP_TRAMPOLINE_CODE. 
Something like a new separate clause:

   if (we've stepped into a function
       && we're not stopping in this sort of code
       && skip trampoline returns something)
     run to skip trampoline breakpoint, possibly doing a step into function


> What is actually supposed to happen in this case? The documentation says:
> @findex SKIP_TRAMPOLINE_CODE

I think these should be generic attributes of the frame, as you note, 
there are already too many special cases.

Andrew

> If the target machine has trampoline code that sits between callers and
> the functions being called, then define this macro to return a new PC
> that is at the start of the real function.
> 
> But how do you do this if your target address is not yet resolved? The
> attached patch gives a workaround for this problem (also needs a small
> fix to the target code), but it seems a bit clumsy to me.... it's not
> like handle_inferior_event () needs any more special cases... :-(
> 
> Comments? Suggestions?



  reply	other threads:[~2004-05-21 16:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-21  6:44 Randolph Chung
2004-05-21 16:00 ` Andrew Cagney [this message]
2004-05-21 18:21   ` Randolph Chung
2004-05-24 17:32     ` Andrew Cagney
2004-05-24 18:52       ` Randolph Chung
2004-05-25  7:13       ` Randolph Chung

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=40AE27AC.6090205@gnu.org \
    --to=cagney@gnu.org \
    --cc=gdb@sources.redhat.com \
    --cc=randolph@tausq.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox