This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: IA-32 gas _GLOBAL_OFFSET_TABLE_ handling bugs
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Roland McGrath <roland at redhat dot com>, binutils at sources dot redhat dot com
- Date: Thu, 1 Aug 2002 12:05:59 +0200
- Subject: Re: IA-32 gas _GLOBAL_OFFSET_TABLE_ handling bugs
- References: <20020731152058.M20867@sunsite.ms.mff.cuni.cz> <20020801005632.GH12579@bubble.sa.bigpond.net.au> <20020731183115.J15334@redhat.sf.frob.com> <20020801023818.GM12579@bubble.sa.bigpond.net.au>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Thu, Aug 01, 2002 at 12:08:18PM +0930, Alan Modra wrote:
> On Wed, Jul 31, 2002 at 06:31:15PM -0700, Roland McGrath wrote:
> > Actually, the case generated by GCC that bit me does not use `.' at all.
> > It looks like this:
> >
> > movl $.L30, %eax
> > .L30:
> > addl $_GLOBAL_OFFSET_TABLE_, %eax
>
> Eep. We really have dug a pit for ourselves with this syntax. Does
> this work on other assemblers? Can gcc be fixed to not emit the
> above?
No. gcc has been doing this in 2.95.x already:
call .LPR0
addl $_GLOBAL_OFFSET_TABLE_,%ebx
.ident "GCC: (GNU) 2.95.4 20010319 (prerelease)"
(with -mcpu=i686).
Both
addl $_GLOBAL_OFFSET_TABLE_+[.-XXX], %ebx
and
addl $_GLOBAL_OFFSET_TABLE_, %ebx
must do what it was doing until now unless we want to screw up all gcc's
since 2.95.x era, ie. R_386_GOTPC relocation with 2+[.-XXX] resp. 2 in
the addend.
gcc 3.3 and any TLS enabled GCCs will also use
addl $_GLOBAL_OFFSET_TABLE_+[.-XXX], %reg
addl $_GLOBAL_OFFSET_TABLE_, %reg
forms where reg can be any 32-bit general register.
With %eax this means the addend should be 1+[.-XXX] resp. 1.
In this case we can IMHO decide whether we want to use this braindamaged
syntax or some other (addl $_GLOBAL_OFFSET_TABLE_+[.-XXX]@GOTPC, %eax?),
as GCC will need 2.13+ gas for it to work properly anyway, unless
we decide to keep status quo and require GCC to use
addl $_GLOBAL_OFFSET_TABLE_+[.-XXX-1], %eax
resp.
addl $_GLOBAL_OFFSET_TABLE_-1, %eax.
The rest depends on
a) what Solaris and other proprietary assemblers do
b) whether anyone is already using those constructs
Certainly, .long _GLOBAL_OFFSET_TABLE_ resulting in R_386_GOTPC reloc
is very weird.
Anyone has access to Solaris/x86 as?
>
> This is really taking "do what I mean rather than what I say" to new
> heights. Presumably, the magic _GLOBAL_OFFSET_TABLE_ transformations
> should only happen on "add" or "lea" type instructions, so that
>
> mov $_GLOBAL_OFFSET_TABLE_, %eax
>
> does the right thing.
Jakub