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?
next prev parent 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