1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2024-09-11 15:08:33 +01:00
nixpkgs/pkgs/development/compilers/go/R_386_GOT32.patch
2015-07-09 11:05:46 +02:00

47 lines
1.4 KiB
Diff

From 609d996fac7f68b34032572b7bde627f658b95f2 Mon Sep 17 00:00:00 2001
From: Russ Cox <rsc@golang.org>
Date: Mon, 6 Oct 2014 14:17:48 -0400
Subject: [PATCH] cmd/8l: accept R_386_GOT32 in push instruction
Fixes #8382.
LGTM=iant
R=iant
CC=golang-codereviews
https://golang.org/cl/149540045
---
src/cmd/8l/asm.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c
index c135dce..98c0424 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);