aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hudson-Doyle <michael.hudson@canonical.com>2016-04-06 21:26:59 +1200
committerRuss Cox <rsc@golang.org>2016-05-18 14:14:36 +0000
commitf8c06b1f70334203f4fee20557b4b9ca7a1d9d8d (patch)
tree9135cd8dc6fa3788201a87b731f5d90444b054d4
parent50eb39bb23e8b03e823c38e844f0410d0b5325d2 (diff)
downloadgo-f8c06b1f70334203f4fee20557b4b9ca7a1d9d8d.tar.gz
go-f8c06b1f70334203f4fee20557b4b9ca7a1d9d8d.zip
cmd/ld, cmd/5l, cmd/8l: support new 386/amd64 relocations
Backport of golang.org/cl/16529 to release-branch.go1.4. I wanted to build go 1.4 packages for Xenial so I did this. It's not enough for 1.4.4 but it may as well be included if we ever find a reason to release that, so I thought I'd send it in. Change-Id: I907627586e6c7a0580ae447a349c0e3534d64e3d Reviewed-on: https://go-review.googlesource.com/21598 Reviewed-by: Russ Cox <rsc@golang.org>
-rw-r--r--src/cmd/6l/asm.c2
-rw-r--r--src/cmd/8l/asm.c1
-rw-r--r--src/cmd/ld/elf.h8
-rw-r--r--src/cmd/ld/ldelf.c3
4 files changed, 11 insertions, 3 deletions
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c
index 18b5aa3119..2e9d339aef 100644
--- a/src/cmd/6l/asm.c
+++ b/src/cmd/6l/asm.c
@@ -118,6 +118,8 @@ adddynrel(LSym *s, Reloc *r)
return;
case 256 + R_X86_64_GOTPCREL:
+ case 256 + R_X86_64_GOTPCRELX:
+ case 256 + R_X86_64_REX_GOTPCRELX:
if(targ->type != SDYNIMPORT) {
// have symbol
if(r->off >= 2 && s->p[r->off-2] == 0x8b) {
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c
index 98c0424037..cff29488e8 100644
--- a/src/cmd/8l/asm.c
+++ b/src/cmd/8l/asm.c
@@ -115,6 +115,7 @@ adddynrel(LSym *s, Reloc *r)
return;
case 256 + R_386_GOT32:
+ case 256 + R_386_GOT32X:
if(targ->type != SDYNIMPORT) {
// have symbol
if(r->off >= 2 && s->p[r->off-2] == 0x8b) {
diff --git a/src/cmd/ld/elf.h b/src/cmd/ld/elf.h
index e84d996f25..e909a828d1 100644
--- a/src/cmd/ld/elf.h
+++ b/src/cmd/ld/elf.h
@@ -502,8 +502,9 @@ typedef struct {
#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */
#define R_X86_64_GOTTPOFF 22 /* PC relative offset to IE GOT entry */
#define R_X86_64_TPOFF32 23 /* Offset in static TLS block */
-
-#define R_X86_64_COUNT 24 /* Count of defined relocation types. */
+#define R_X86_64_GOTPCRELX 41
+#define R_X86_64_REX_GOTPCRELX 42
+#define R_X86_64_COUNT 26 /* Count of defined relocation types. */
#define R_ALPHA_NONE 0 /* No reloc */
@@ -612,8 +613,9 @@ typedef struct {
#define R_386_TLS_DTPMOD32 35 /* GOT entry containing TLS index */
#define R_386_TLS_DTPOFF32 36 /* GOT entry containing TLS offset */
#define R_386_TLS_TPOFF32 37 /* GOT entry of -ve static TLS offset */
+#define R_386_GOT32X 43
-#define R_386_COUNT 38 /* Count of defined relocation types. */
+#define R_386_COUNT 39 /* Count of defined relocation types. */
#define R_PPC_NONE 0 /* No relocation. */
#define R_PPC_ADDR32 1
diff --git a/src/cmd/ld/ldelf.c b/src/cmd/ld/ldelf.c
index dd5fa0d2a8..2e2fbd1737 100644
--- a/src/cmd/ld/ldelf.c
+++ b/src/cmd/ld/ldelf.c
@@ -888,12 +888,15 @@ reltype(char *pn, int elftype, uchar *siz)
case R('6', R_X86_64_PC32):
case R('6', R_X86_64_PLT32):
case R('6', R_X86_64_GOTPCREL):
+ case R('6', R_X86_64_GOTPCRELX):
+ case R('6', R_X86_64_REX_GOTPCRELX):
case R('8', R_386_32):
case R('8', R_386_PC32):
case R('8', R_386_GOT32):
case R('8', R_386_PLT32):
case R('8', R_386_GOTOFF):
case R('8', R_386_GOTPC):
+ case R('8', R_386_GOT32X):
*siz = 4;
break;
case R('6', R_X86_64_64):