Commit 609d996f authored by Russ Cox's avatar Russ Cox

cmd/8l: accept R_386_GOT32 in push instruction

Fixes #8382.

LGTM=iant
R=iant
CC=golang-codereviews
https://golang.org/cl/149540045
parent 52fe7c56
...@@ -117,13 +117,21 @@ adddynrel(LSym *s, Reloc *r) ...@@ -117,13 +117,21 @@ adddynrel(LSym *s, Reloc *r)
case 256 + R_386_GOT32: case 256 + R_386_GOT32:
if(targ->type != SDYNIMPORT) { if(targ->type != SDYNIMPORT) {
// have symbol // have symbol
// turn MOVL of GOT entry into LEAL of symbol itself if(r->off >= 2 && s->p[r->off-2] == 0x8b) {
if(r->off < 2 || s->p[r->off-2] != 0x8b) { // turn MOVL of GOT entry into LEAL of symbol address, relative to GOT.
diag("unexpected GOT reloc for non-dynamic symbol %s", targ->name); s->p[r->off-2] = 0x8d;
r->type = R_GOTOFF;
return; return;
} }
s->p[r->off-2] = 0x8d; if(r->off >= 2 && s->p[r->off-2] == 0xff && s->p[r->off-1] == 0xb3) {
r->type = R_GOTOFF; // turn PUSHL of GOT entry into PUSHL of symbol itself.
// use unnecessary SS prefix to keep instruction same length.
s->p[r->off-2] = 0x36;
s->p[r->off-1] = 0x68;
r->type = R_ADDR;
return;
}
diag("unexpected GOT reloc for non-dynamic symbol %s", targ->name);
return; return;
} }
addgotsym(ctxt, targ); addgotsym(ctxt, targ);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment