Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Alan Modra <amodra@bigpond.net.au>
To: PAUL GILLIAM <pgilliam@us.ibm.com>, 	gdb-patches@sources.redhat.com
Subject: Re: [patch] Strange stepping behaviour with ppc32 with secure PLTs
Date: Mon, 15 May 2006 03:34:00 -0000	[thread overview]
Message-ID: <20060515005619.GC19700@bubble.grove.modra.org> (raw)
In-Reply-To: <20060513145829.GA3721@nevyn.them.org>

On Sat, May 13, 2006 at 10:58:29AM -0400, Daniel Jacobowitz wrote:
> On Sun, May 14, 2006 at 12:01:41AM +0930, Alan Modra wrote:
> > Not too hard, but messy.  The only real difficulty is finding the stubs.
> > We don't have any handy symbols or relocs to identify them, so that
> > means code reading.
> > 
> > We do have --emit-stub-syms to emit symbols on stubs at link time.  I
> > probably should have made the linker always emit the first stub sym so
> > we could easily find all the stubs.

In thinking about this some more, I remembered why I didn't implement
synthetic stub syms for powerpc.  There is a really difficult problem
with -fPIC code, which can have multiple GOTs.  The stubs for -fPIC
-shared or -fPIC -pie code calculate the plt entry from the got pointer
used by the calling function.  That means we might need multiple stubs
for any given plt entry.  eg. printf called from f1 and f2 where f1 uses
a different GOT to f2 will require two stubs and one .plt entry.  So we
can't just start from the first stub and match one for one with plt
entries.  Worse, code reading the stub doesn't give us a clue about the
got pointer value.  So BFD can't match stubs to plt entries without
finding where the stub is falled *from*, and then analysing the function
prologue.  This is way too hard.

> Hmm.  Do they still end up in a section named .plt?  That'd probably
> make it easier for both gdb and binutils.

No.  If people use the default linker scripts, stubs are at the end of
.text.  .plt is just an array of addresses.

> > > The right thing to do then is probably to create the synthetic symbols
> > > at exactly those same addresses.
> > 
> > No, if I understand correctly, Paul wants to use a stub symbol as a
> > means of letting gdb know that it is in a plt call trampoline.  Putting
> > the symbol in .plt won't do that for you.  Best just teach gdb what a
> > plt call stub looks like.
> 
> There's two things necessary to make stepping and shared libraries play
> nice.
> 
> 1.  Be able to unwind from the stub, so that we can see we've stepped
> into something.  We need symbols or some other similar code reading in
> order to make this work.
> 
> 2.  Be able to identify this debug-info-less block of code as a stub,
> so that we can skip it if we're going to step into a shared library
> function that has debug info.  I pointed Paul at the right function for
> handling this earlier, but it's somewhat orthogonal.

I think code reading is the way to go on both of these.  Presumably gdb
knows the register state for both of these problems, so finding the
caller (from lr) isn't hard, and you reach the callee just by
single-stepping a few insns.

-shared and -pie stubs look like:

  lwz 11,(plt_entry-got_pointer)(30)
  mtctr 11
  bctr
  nop

or

  addis 11,30,(plt_entry-got_pointer)@ha
  lwz 11,(plt_entry-got_pointer)@l(11)
  mtctr 11
  bctr

depending on the size of (plt_entry-got_pointer).

Non-shared, non-pie stubs look like:

  lis 11,plt_entry@ha
  lwz 11,plt_entry@l(11)
  mtctr
  bctr

These sequences are different to those emitted by gcc for indirect
function calls.

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


  reply	other threads:[~2006-05-15  0:56 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-12 22:50 PAUL GILLIAM
2006-05-12 23:12 ` Daniel Jacobowitz
2006-05-13  1:46   ` PAUL GILLIAM
2006-05-13 14:58   ` Alan Modra
2006-05-13 15:13     ` Daniel Jacobowitz
2006-05-15  3:34       ` Alan Modra [this message]
2006-05-15 15:10         ` Daniel Jacobowitz
2006-05-16  2:07           ` Alan Modra
2006-05-16  2:35             ` Daniel Jacobowitz
2006-05-16  7:18             ` Mark Kettenis
2006-05-16 17:53               ` Alan Modra
2006-05-19 17:38                 ` PAUL GILLIAM
2006-05-20  1:32                   ` Alan Modra
2006-06-23 21:06                     ` PAUL GILLIAM
2006-06-23 21:22                       ` Daniel Jacobowitz

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=20060515005619.GC19700@bubble.grove.modra.org \
    --to=amodra@bigpond.net.au \
    --cc=gdb-patches@sources.redhat.com \
    --cc=pgilliam@us.ibm.com \
    /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