PR16794, gold ignores R_386_GOTOFF addend
H.J. Lu
hjl.tools@gmail.com
Thu Sep 26 16:10:00 GMT 2019
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.
--
H.J.
More information about the Binutils
mailing list