PATCH: Optimize protected call for i386
Alan Modra
amodra@bigpond.net.au
Wed May 14 23:51:00 GMT 2003
On Wed, May 14, 2003 at 04:24:39PM -0700, Richard Henderson wrote:
> On Thu, May 15, 2003 at 08:32:53AM +0930, Alan Modra wrote:
> > I see. I think this is wrong. gcc needs to emit the normal PIC call,
> > ie. "call foo@PLT" so the the linker can set up a plt entry if
> > needed.
>
> I disagree.
>
> > A plt entry is needed for protected symbols so that function
> > pointer comparisons work, since the x86 ABI uses the .plt entry for
> > the value of a function symbol referenced by a dynamic object.
> > Consider liba.so exporting a protected symbol foo. Will a function
> > pointer, value foo, passed to libb.so compare equal to &foo in
> > libb.so? What about a function pointer, value foo, passed from
> > libb.so back to liba.so?
>
> None of which has anything to do with call instructions.
Well, it may be that the linker will set up a plt entry anyway,
thus making the function pointer comparisons work properly. The
problem is that if gcc emits "call foo" for protected syms, you'll get
an R_386_PC32 reloc on foo. How is the linker supposed to distinguish
this reloc from an R_386_PC32 on ".long foo - ."? In the second case,
you really want to use the plt entry address.
> If liba.so contains a call to foo, ld *knows* that foo *must*
> resolve to the version in liba.so and nowhere else. Thus we
> can direct the call to foo without going through a PLT entry.
Exactly. ld can do this even when gcc emits "call foo@PLT".
> If you take the address of foo, in *any* DSO, you will not be
> using either R_386_PC32 or R_386_PLT32. You'll be using either
> R_386_32 or R_386_GOT32.
Does the ABI preclude use of R_386_PC32 from assembly?
--
Alan Modra
IBM OzLabs - Linux Technology Centre
More information about the Gcc
mailing list