From: Russ Cox Date: Mon, 6 Oct 2014 18:17:48 +0000 (-0400) Subject: cmd/8l: accept R_386_GOT32 in push instruction X-Git-Tag: go1.4beta1~193 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=609d996fac7f68b34032572b7bde627f658b95f2;p=gostls13.git cmd/8l: accept R_386_GOT32 in push instruction Fixes #8382. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/149540045 --- diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index c135dce709..98c0424037 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -117,13 +117,21 @@ adddynrel(LSym *s, Reloc *r) case 256 + R_386_GOT32: if(targ->type != SDYNIMPORT) { // have symbol - // turn MOVL of GOT entry into LEAL of symbol itself - if(r->off < 2 || s->p[r->off-2] != 0x8b) { - diag("unexpected GOT reloc for non-dynamic symbol %s", targ->name); + if(r->off >= 2 && s->p[r->off-2] == 0x8b) { + // turn MOVL of GOT entry into LEAL of symbol address, relative to GOT. + s->p[r->off-2] = 0x8d; + r->type = R_GOTOFF; return; } - s->p[r->off-2] = 0x8d; - r->type = R_GOTOFF; + if(r->off >= 2 && s->p[r->off-2] == 0xff && s->p[r->off-1] == 0xb3) { + // 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; } addgotsym(ctxt, targ);