This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PR16794, gold ignores R_386_GOTOFF addend
On Thu, Sep 26, 2019 at 11:52 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Thu, Sep 26, 2019 at 09:09:26AM -0700, H.J. Lu wrote:
> > On Wed, Sep 25, 2019 at 10:23 PM Alan Modra <amodra@gmail.com> wrote:
> > >
> > > An R_386_GOTOFF relocation has an addend, typically used when a
> > > symbol can be replaced by its section symbol plus an offset.
> > > psymval->value(object,0) is quite wrong then, fix it. The same goes
> > > for R_X86_64_GOTOFF64.
> > >
> > > Note that R_X86_64_GOTOFF64 isn't easy to generate from gcc, and may
> > > in fact be impossible nowadays. Also, x86 gas won't reduce symbols to
> > > section symbols on R_386_GOTOFF and R_X86_64_GOTOFF64. I suspect that
> > > isn't necessary, but I'm leaving that to HJ to investigate. (Keeping
> > > the original symbol is necessary for most GOT relocs in order to
> > > generate the proper GOT entry because the ABI says to put the symbol
> > > in the GOT entry, not symbol plus addend. The addend becomes a
> > > useless offset from the GOT entry. But anyway, these two relocs don't
> > > generate a GOT entry.)
> > >
> >
> > I got
> >
> > [hjl@gnu-cfl-1 tmp]$ cat y.s
> > .text
> > .globl foo
> > .type foo, @function
> > foo:
> > leal 2+bar@GOTOFF(%eax), %eax
> > .size foo, .-foo
> > .data
> > .align 4
> > .type bar, @object
> > .size bar, 10
> > bar:
> > .string "\001"
> > .zero 8
> > [hjl@gnu-cfl-1 tmp]$ gcc -c -m32 y.s
> > [hjl@gnu-cfl-1 tmp]$ readelf -r y.o
> >
> > Relocation section '.rel.text' at offset 0x110 contains 1 entry:
> > Offset Info Type Sym.Value Sym. Name
> > 00000002 00000209 R_386_GOTOFF 00000000 .data
> > [hjl@gnu-cfl-1 tmp]$
> >
> > GOTOFF relocation against the local symbol is reduced to
> > section.
>
> Huh, so it is. Anyway, do you agree that the gold patches are correct?
It looks correct to me. pcrel is used with GOT address , instead of
relocation address.
> This case isn't reduced to a section symbol:
> .text
> .globl foo
> .type foo, @function
> foo:
> leal 2+bar@GOTOFF(%eax), %eax
> .size foo, .-foo
> .section .rodata.str.1,"ams",1
> .type bar, @object
> .size bar, 4
> bar:
> .string "abc"
>
> Nor this:
> .text
> .global _start
> _start:
> nop
> nop
> .L1:
> nop
> nop
> nop
> nop
> .L2:
> nop
> nop
> nop
> nop
> nop
> nop
> nop
> nop
> .L3:
> nop
> .L4:
> .data
> .dc.a .L1@gotoff
> .dc.a .L2@gotoff
> .dc.a .L3@gotoff
> .dc.a .L4@gotoff
>
These must be some special cases.
--
H.J.