https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118497
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The reason this has been reported is that golang cgo has some weird code to
rewrite @GOT references which can deal with R_386_GOT32{,X} relocations only in
very limited subset of instructions, just movl symbol@GOT(%reg1), %reg2 and
pushl symbol@GOT(%ebx).
And with this change it got turned into pushl symbol@GOT(%eax) instead.
GCC regularly emits also e.g. addl symbol@GOT(%reg1), %reg2 which the
https://github.com/golang/go/blob/master/src/cmd/link/internal/x86/asm.go#L177
if r.Off() >= 2 && sData[r.Off()-2] == 0x8b {
su.MakeWritable()
// turn MOVL of GOT entry into LEAL of symbol
address, relative to GOT.
writeableData := su.Data()
writeableData[r.Off()-2] = 0x8d
su.SetRelocType(rIdx, objabi.R_GOTOFF)
return true
}
if r.Off() >= 2 && sData[r.Off()-2] == 0xff &&
sData[r.Off()-1] == 0xb3 {
su.MakeWritable()
// turn PUSHL of GOT entry into PUSHL of symbol
itself.
// use unnecessary SS prefix to keep
instruction same length.
writeableData := su.Data()
writeableData[r.Off()-2] = 0x36
writeableData[r.Off()-1] = 0x68
su.SetRelocType(rIdx, objabi.R_ADDR)
return true
}
ldr.Errorf(s, "unexpected GOT reloc for non-dynamic
symbol %s", ldr.SymName(targ))
return false
code doesn't handle. Anyway, guess that is golang bug, but the regression is
in emitting larger code unnecessarily.