From d6eefad445831c161fca130f9bdf7b3848aac23c Mon Sep 17 00:00:00 2001
From: Paul Gortmaker <paul.gortmaker@windriver.com>
Date: Tue, 29 Mar 2016 21:14:33 -0400
Subject: [PATCH] go-cross: backport "cmd/link: support new 386/amd64
 relocations"

Newer binutils won't support building older go-1.4.3 as per:

https://github.com/golang/go/issues/13114

Upstream commit 914db9f060b1fd3eb1f74d48f3bd46a73d4ae9c7 (see subj)
was identified as the fix and nominated for 1.4.4 but that release
never happened.  The paths in 1.4.3 aren't the same as go1.6beta1~662
where this commit appeared, but the NetBSD folks indicated what a
1.4.3 backport would look like here: https://gnats.netbsd.org/50777

This is based on that, but without the BSD wrapper infrastructure
layer that makes things look like patches of patches.

Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>

Upstream-Status: Backport [ Partial ]

diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c
index 18b5aa311981..2e9d339aef87 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 98c04240374f..cff29488e8af 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 e84d996f2596..bbf2cfaa3cc0 100644
--- a/src/cmd/ld/elf.h
+++ b/src/cmd/ld/elf.h
@@ -478,32 +478,47 @@ typedef struct {
  * Relocation types.
  */
 
-#define	R_X86_64_NONE	0	/* No relocation. */
-#define	R_X86_64_64	1	/* Add 64 bit symbol value. */
-#define	R_X86_64_PC32	2	/* PC-relative 32 bit signed sym value. */
-#define	R_X86_64_GOT32	3	/* PC-relative 32 bit GOT offset. */
-#define	R_X86_64_PLT32	4	/* PC-relative 32 bit PLT offset. */
-#define	R_X86_64_COPY	5	/* Copy data from shared object. */
-#define	R_X86_64_GLOB_DAT 6	/* Set GOT entry to data address. */
-#define	R_X86_64_JMP_SLOT 7	/* Set GOT entry to code address. */
-#define	R_X86_64_RELATIVE 8	/* Add load address of shared object. */
-#define	R_X86_64_GOTPCREL 9	/* Add 32 bit signed pcrel offset to GOT. */
-#define	R_X86_64_32	10	/* Add 32 bit zero extended symbol value */
-#define	R_X86_64_32S	11	/* Add 32 bit sign extended symbol value */
-#define	R_X86_64_16	12	/* Add 16 bit zero extended symbol value */
-#define	R_X86_64_PC16	13	/* Add 16 bit signed extended pc relative symbol value */
-#define	R_X86_64_8	14	/* Add 8 bit zero extended symbol value */
-#define	R_X86_64_PC8	15	/* Add 8 bit signed extended pc relative symbol value */
-#define	R_X86_64_DTPMOD64 16	/* ID of module containing symbol */
-#define	R_X86_64_DTPOFF64 17	/* Offset in TLS block */
-#define	R_X86_64_TPOFF64 18	/* Offset in static TLS block */
-#define	R_X86_64_TLSGD	19	/* PC relative offset to GD GOT entry */
-#define	R_X86_64_TLSLD	20	/* PC relative offset to LD GOT entry */
-#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_NONE           0
+#define	R_X86_64_64             1
+#define	R_X86_64_PC32           2
+#define	R_X86_64_GOT32          3
+#define	R_X86_64_PLT32          4
+#define	R_X86_64_COPY           5
+#define	R_X86_64_GLOB_DAT       6
+#define	R_X86_64_JMP_SLOT       7
+#define	R_X86_64_RELATIVE       8
+#define	R_X86_64_GOTPCREL       9
+#define	R_X86_64_32             10
+#define	R_X86_64_32S            11
+#define	R_X86_64_16             12
+#define	R_X86_64_PC16           13
+#define	R_X86_64_8              14
+#define	R_X86_64_PC8            15
+#define	R_X86_64_DTPMOD64       16
+#define	R_X86_64_DTPOFF64       17
+#define	R_X86_64_TPOFF64        18
+#define	R_X86_64_TLSGD          19
+#define	R_X86_64_TLSLD          20
+#define	R_X86_64_DTPOFF32       21
+#define	R_X86_64_GOTTPOFF       22
+#define	R_X86_64_TPOFF32        23
+#define	R_X86_64_PC64           24
+#define	R_X86_64_GOTOFF64       25
+#define	R_X86_64_GOTPC32        26
+#define	R_X86_64_GOT64          27
+#define	R_X86_64_GOTPCREL64     28
+#define	R_X86_64_GOTPC64        29
+#define	R_X86_64_GOTPLT64       30
+#define	R_X86_64_PLTOFF64       31
+#define	R_X86_64_SIZE32         32
+#define	R_X86_64_SIZE64         33
+#define	R_X86_64_GOTPC32_TLSDEC 34
+#define	R_X86_64_TLSDESC_CALL   35
+#define	R_X86_64_TLSDESC        36
+#define	R_X86_64_IRELATIVE      37
+#define	R_X86_64_PC32_BND       40
+#define	R_X86_64_GOTPCRELX      41
+#define	R_X86_64_REX_GOTPCRELX  42
 
 
 #define	R_ALPHA_NONE		0	/* No reloc */
@@ -581,39 +596,42 @@ typedef struct {
 #define	R_ARM_COUNT		38	/* Count of defined relocation types. */
 
 
-#define	R_386_NONE	0	/* No relocation. */
-#define	R_386_32	1	/* Add symbol value. */
-#define	R_386_PC32	2	/* Add PC-relative symbol value. */
-#define	R_386_GOT32	3	/* Add PC-relative GOT offset. */
-#define	R_386_PLT32	4	/* Add PC-relative PLT offset. */
-#define	R_386_COPY	5	/* Copy data from shared object. */
-#define	R_386_GLOB_DAT	6	/* Set GOT entry to data address. */
-#define	R_386_JMP_SLOT	7	/* Set GOT entry to code address. */
-#define	R_386_RELATIVE	8	/* Add load address of shared object. */
-#define	R_386_GOTOFF	9	/* Add GOT-relative symbol address. */
-#define	R_386_GOTPC	10	/* Add PC-relative GOT table address. */
-#define	R_386_TLS_TPOFF	14	/* Negative offset in static TLS block */
-#define	R_386_TLS_IE	15	/* Absolute address of GOT for -ve static TLS */
-#define	R_386_TLS_GOTIE	16	/* GOT entry for negative static TLS block */
-#define	R_386_TLS_LE	17	/* Negative offset relative to static TLS */
-#define	R_386_TLS_GD	18	/* 32 bit offset to GOT (index,off) pair */
-#define	R_386_TLS_LDM	19	/* 32 bit offset to GOT (index,zero) pair */
-#define	R_386_TLS_GD_32	24	/* 32 bit offset to GOT (index,off) pair */
-#define	R_386_TLS_GD_PUSH 25	/* pushl instruction for Sun ABI GD sequence */
-#define	R_386_TLS_GD_CALL 26	/* call instruction for Sun ABI GD sequence */
-#define	R_386_TLS_GD_POP 27	/* popl instruction for Sun ABI GD sequence */
-#define	R_386_TLS_LDM_32 28	/* 32 bit offset to GOT (index,zero) pair */
-#define	R_386_TLS_LDM_PUSH 29	/* pushl instruction for Sun ABI LD sequence */
-#define	R_386_TLS_LDM_CALL 30	/* call instruction for Sun ABI LD sequence */
-#define	R_386_TLS_LDM_POP 31	/* popl instruction for Sun ABI LD sequence */
-#define	R_386_TLS_LDO_32 32	/* 32 bit offset from start of TLS block */
-#define	R_386_TLS_IE_32	33	/* 32 bit offset to GOT static TLS offset entry */
-#define	R_386_TLS_LE_32	34	/* 32 bit offset within static TLS block */
-#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_COUNT	38	/* Count of defined relocation types. */
+#define	R_386_NONE          0
+#define	R_386_32            1
+#define	R_386_PC32          2
+#define	R_386_GOT32         3
+#define	R_386_PLT32         4
+#define	R_386_COPY          5
+#define	R_386_GLOB_DAT      6
+#define	R_386_JMP_SLOT      7
+#define	R_386_RELATIVE      8
+#define	R_386_GOTOFF        9
+#define	R_386_GOTPC         10
+#define	R_386_TLS_TPOFF     14
+#define	R_386_TLS_IE        15
+#define	R_386_TLS_GOTIE     16
+#define	R_386_TLS_LE        17
+#define	R_386_TLS_GD        18
+#define	R_386_TLS_LDM       19
+#define	R_386_TLS_GD_32     24
+#define	R_386_TLS_GD_PUSH   25
+#define	R_386_TLS_GD_CALL   26
+#define	R_386_TLS_GD_POP    27
+#define	R_386_TLS_LDM_32    28
+#define	R_386_TLS_LDM_PUSH  29
+#define	R_386_TLS_LDM_CALL  30
+#define	R_386_TLS_LDM_POP   31
+#define	R_386_TLS_LDO_32    32
+#define	R_386_TLS_IE_32     33
+#define	R_386_TLS_LE_32     34
+#define	R_386_TLS_DTPMOD32  35
+#define	R_386_TLS_DTPOFF32  36
+#define	R_386_TLS_TPOFF32   37
+#define	R_386_TLS_GOTDESC   39
+#define	R_386_TLS_DESC_CALL 40
+#define	R_386_TLS_DESC      41
+#define	R_386_IRELATIVE     42
+#define	R_386_GOT32X        43
 
 #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 dd5fa0d2a839..2e2fbd17377f 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):
-- 
2.7.2

