From f8c06b1f70334203f4fee20557b4b9ca7a1d9d8d Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Wed, 6 Apr 2016 21:26:59 +1200 Subject: 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 --- src/cmd/6l/asm.c | 2 ++ src/cmd/8l/asm.c | 1 + src/cmd/ld/elf.h | 8 +++++--- src/cmd/ld/ldelf.c | 3 +++ 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): -- cgit v1.2.3-54-g00ecf