Package: golang
Version: 2:1.5.1-4
Severity: normal
Tags: upstream patch

Building golang fails with these errors:

    ...
    # cmd/trace
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    runtime/cgo(.text): unexpected relocation type 298
    runtime/cgo(.text): unexpected relocation type 298
    runtime/cgo(.text): unexpected relocation type 298
    # cmd/pprof
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    runtime/cgo(.text): unexpected relocation type 298
    runtime/cgo(.text): unexpected relocation type 298
    runtime/cgo(.text): unexpected relocation type 298
    # cmd/go
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    /build/golang-1.5.1/pkg/linux_amd64/runtime/cgo.a(_all.o): unknown 
relocation type 42; compiled without -fpic?
    runtime/cgo(.text): unexpected relocation type 298
    runtime/cgo(.text): unexpected relocation type 298
    runtime/cgo(.text): unexpected relocation type 298
    debian/rules:62: recipe for target 'override_dh_auto_build-arch' failed
    make[1]: *** [override_dh_auto_build-arch] Error 2
    make[1]: Leaving directory '/build/golang-1.5.1'
    debian/rules:15: recipe for target 'build' failed
    make: *** [build] Error 2
    dpkg-buildpackage: error: debian/rules build gave error exit status 2

The problem is fixed upstream here:

    https://github.com/golang/go/commit/914db9f060b1fd3eb1f74d48f3bd46a73d4ae9c7

but that commit does not apply cleanly to the current Debian version.
I've attached an equivalent patch that does, but I didn't manage to
preserve the original author, date, etc.  Please use the original
metadata from the github commit if you decide to apply this.

-- System Information:
Debian Release: stretch/sid
  APT prefers testing
  APT policy: (500, 'testing'), (400, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 4.2.0-1-amd64 (SMP w/8 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages golang depends on:
ii  golang-doc  2:1.5.1-4
ii  golang-go   2:1.5.1-4
ii  golang-src  2:1.5.1-4

golang recommends no packages.

golang suggests no packages.

-- no debconf information
>From 716b8354f9fba9e67543c07c91438fa382046023 Mon Sep 17 00:00:00 2001
From: Eric Cooper <e...@cmu.edu>
Date: Sat, 5 Dec 2015 15:19:25 -0500
Subject: [PATCH 3/3] The GNU binutils recently picked up support for new
 386/amd64 relocations. Add support for them in the Go linker when doing an
 internal link.

The 386 relocation R_386_GOT32X was proposed in
https://groups.google.com/forum/#!topic/ia32-abi/GbJJskkid4I .  It can
be treated as identical to the R_386_GOT32 relocation.

The amd64 relocations R_X86_64_GOTPCRELX and R_X86_64_REX_GOTPCRELX were
proposed in
https://groups.google.com/forum/#!topic/x86-64-abi/n9AWHogmVY0 .  They
can both be treated as identical to the R_X86_64_GOTPCREL relocation.

The purpose of the new relocations is to permit additional linker
relaxations in some cases.  We do not attempt to support those cases.

While we're at it, remove the unused and in some cases out of date
_COUNT names from ld/elf.go.

Fixes #13114.

Change-Id: I34ef07f6fcd00cdd2996038ecf46bb77a49e968b
Reviewed-on: https://go-review.googlesource.com/16529
Reviewed-by: Minux Ma <mi...@golang.org>
Signed-off-by: Eric Cooper <e...@cmu.edu>
---
 src/cmd/link/internal/amd64/asm.go |   2 +-
 src/cmd/link/internal/ld/elf.go    | 141 +++++++++++++++++++++----------------
 src/cmd/link/internal/ld/ldelf.go  |   3 +
 src/cmd/link/internal/x86/asm.go   |   2 +-
 4 files changed, 86 insertions(+), 62 deletions(-)

diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go
index 74ec9dd..4eb2092 100644
--- a/src/cmd/link/internal/amd64/asm.go
+++ b/src/cmd/link/internal/amd64/asm.go
@@ -141,7 +141,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
 
 		return
 
-	case 256 + ld.R_X86_64_GOTPCREL:
+	case 256 + ld.R_X86_64_GOTPCREL, 256 + ld.R_X86_64_GOTPCRELX, 256 + ld.R_X86_64_REX_GOTPCRELX:
 		if targ.Type != obj.SDYNIMPORT {
 			// have symbol
 			if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go
index 508f055..66ac543 100644
--- a/src/cmd/link/internal/ld/elf.go
+++ b/src/cmd/link/internal/ld/elf.go
@@ -324,31 +324,48 @@ const (
  * Relocation types.
  */
 const (
-	R_X86_64_NONE              = 0
-	R_X86_64_64                = 1
-	R_X86_64_PC32              = 2
-	R_X86_64_GOT32             = 3
-	R_X86_64_PLT32             = 4
-	R_X86_64_COPY              = 5
-	R_X86_64_GLOB_DAT          = 6
-	R_X86_64_JMP_SLOT          = 7
-	R_X86_64_RELATIVE          = 8
-	R_X86_64_GOTPCREL          = 9
-	R_X86_64_32                = 10
-	R_X86_64_32S               = 11
-	R_X86_64_16                = 12
-	R_X86_64_PC16              = 13
-	R_X86_64_8                 = 14
-	R_X86_64_PC8               = 15
-	R_X86_64_DTPMOD64          = 16
-	R_X86_64_DTPOFF64          = 17
-	R_X86_64_TPOFF64           = 18
-	R_X86_64_TLSGD             = 19
-	R_X86_64_TLSLD             = 20
-	R_X86_64_DTPOFF32          = 21
-	R_X86_64_GOTTPOFF          = 22
-	R_X86_64_TPOFF32           = 23
-	R_X86_64_COUNT             = 24
+	R_X86_64_NONE           = 0
+	R_X86_64_64             = 1
+	R_X86_64_PC32           = 2
+	R_X86_64_GOT32          = 3
+	R_X86_64_PLT32          = 4
+	R_X86_64_COPY           = 5
+	R_X86_64_GLOB_DAT       = 6
+	R_X86_64_JMP_SLOT       = 7
+	R_X86_64_RELATIVE       = 8
+	R_X86_64_GOTPCREL       = 9
+	R_X86_64_32             = 10
+	R_X86_64_32S            = 11
+	R_X86_64_16             = 12
+	R_X86_64_PC16           = 13
+	R_X86_64_8              = 14
+	R_X86_64_PC8            = 15
+	R_X86_64_DTPMOD64       = 16
+	R_X86_64_DTPOFF64       = 17
+	R_X86_64_TPOFF64        = 18
+	R_X86_64_TLSGD          = 19
+	R_X86_64_TLSLD          = 20
+	R_X86_64_DTPOFF32       = 21
+	R_X86_64_GOTTPOFF       = 22
+	R_X86_64_TPOFF32        = 23
+	R_X86_64_PC64           = 24
+	R_X86_64_GOTOFF64       = 25
+	R_X86_64_GOTPC32        = 26
+	R_X86_64_GOT64          = 27
+	R_X86_64_GOTPCREL64     = 28
+	R_X86_64_GOTPC64        = 29
+	R_X86_64_GOTPLT64       = 30
+	R_X86_64_PLTOFF64       = 31
+	R_X86_64_SIZE32         = 32
+	R_X86_64_SIZE64         = 33
+	R_X86_64_GOTPC32_TLSDEC = 34
+	R_X86_64_TLSDESC_CALL   = 35
+	R_X86_64_TLSDESC        = 36
+	R_X86_64_IRELATIVE      = 37
+	R_X86_64_PC32_BND       = 40
+	R_X86_64_GOTPCRELX      = 41
+	R_X86_64_REX_GOTPCRELX  = 42
+
 	R_AARCH64_ABS64            = 257
 	R_AARCH64_ABS32            = 258
 	R_AARCH64_CALL26           = 283
@@ -382,7 +399,7 @@ const (
 	R_ALPHA_GLOB_DAT           = 25
 	R_ALPHA_JMP_SLOT           = 26
 	R_ALPHA_RELATIVE           = 27
-	R_ALPHA_COUNT              = 28
+
 	R_ARM_NONE                 = 0
 	R_ARM_PC24                 = 1
 	R_ARM_ABS32                = 2
@@ -422,39 +439,44 @@ const (
 	R_ARM_RABS32               = 253
 	R_ARM_RPC24                = 254
 	R_ARM_RBASE                = 255
-	R_ARM_COUNT                = 38
-	R_386_NONE                 = 0
-	R_386_32                   = 1
-	R_386_PC32                 = 2
-	R_386_GOT32                = 3
-	R_386_PLT32                = 4
-	R_386_COPY                 = 5
-	R_386_GLOB_DAT             = 6
-	R_386_JMP_SLOT             = 7
-	R_386_RELATIVE             = 8
-	R_386_GOTOFF               = 9
-	R_386_GOTPC                = 10
-	R_386_TLS_TPOFF            = 14
-	R_386_TLS_IE               = 15
-	R_386_TLS_GOTIE            = 16
-	R_386_TLS_LE               = 17
-	R_386_TLS_GD               = 18
-	R_386_TLS_LDM              = 19
-	R_386_TLS_GD_32            = 24
-	R_386_TLS_GD_PUSH          = 25
-	R_386_TLS_GD_CALL          = 26
-	R_386_TLS_GD_POP           = 27
-	R_386_TLS_LDM_32           = 28
-	R_386_TLS_LDM_PUSH         = 29
-	R_386_TLS_LDM_CALL         = 30
-	R_386_TLS_LDM_POP          = 31
-	R_386_TLS_LDO_32           = 32
-	R_386_TLS_IE_32            = 33
-	R_386_TLS_LE_32            = 34
-	R_386_TLS_DTPMOD32         = 35
-	R_386_TLS_DTPOFF32         = 36
-	R_386_TLS_TPOFF32          = 37
-	R_386_COUNT                = 38
+
+	R_386_NONE          = 0
+	R_386_32            = 1
+	R_386_PC32          = 2
+	R_386_GOT32         = 3
+	R_386_PLT32         = 4
+	R_386_COPY          = 5
+	R_386_GLOB_DAT      = 6
+	R_386_JMP_SLOT      = 7
+	R_386_RELATIVE      = 8
+	R_386_GOTOFF        = 9
+	R_386_GOTPC         = 10
+	R_386_TLS_TPOFF     = 14
+	R_386_TLS_IE        = 15
+	R_386_TLS_GOTIE     = 16
+	R_386_TLS_LE        = 17
+	R_386_TLS_GD        = 18
+	R_386_TLS_LDM       = 19
+	R_386_TLS_GD_32     = 24
+	R_386_TLS_GD_PUSH   = 25
+	R_386_TLS_GD_CALL   = 26
+	R_386_TLS_GD_POP    = 27
+	R_386_TLS_LDM_32    = 28
+	R_386_TLS_LDM_PUSH  = 29
+	R_386_TLS_LDM_CALL  = 30
+	R_386_TLS_LDM_POP   = 31
+	R_386_TLS_LDO_32    = 32
+	R_386_TLS_IE_32     = 33
+	R_386_TLS_LE_32     = 34
+	R_386_TLS_DTPMOD32  = 35
+	R_386_TLS_DTPOFF32  = 36
+	R_386_TLS_TPOFF32   = 37
+	R_386_TLS_GOTDESC   = 39
+	R_386_TLS_DESC_CALL = 40
+	R_386_TLS_DESC      = 41
+	R_386_IRELATIVE     = 42
+	R_386_GOT32X        = 43
+
 	R_PPC_NONE                 = 0
 	R_PPC_ADDR32               = 1
 	R_PPC_ADDR24               = 2
@@ -492,7 +514,6 @@ const (
 	R_PPC_SECTOFF_LO           = 34
 	R_PPC_SECTOFF_HI           = 35
 	R_PPC_SECTOFF_HA           = 36
-	R_PPC_COUNT                = 37
 	R_PPC_TLS                  = 67
 	R_PPC_DTPMOD32             = 68
 	R_PPC_TPREL16              = 69
diff --git a/src/cmd/link/internal/ld/ldelf.go b/src/cmd/link/internal/ld/ldelf.go
index 3efdb75..7ff37ad 100644
--- a/src/cmd/link/internal/ld/ldelf.go
+++ b/src/cmd/link/internal/ld/ldelf.go
@@ -1001,12 +1001,15 @@ func reltype(pn string, elftype int, siz *uint8) int {
 		'6' | R_X86_64_PC32<<24,
 		'6' | R_X86_64_PLT32<<24,
 		'6' | R_X86_64_GOTPCREL<<24,
+		'6' | R_X86_64_GOTPCRELX<<24,
+		'6' | R_X86_64_REX_GOTPCRELX<<24,
 		'8' | R_386_32<<24,
 		'8' | R_386_PC32<<24,
 		'8' | R_386_GOT32<<24,
 		'8' | R_386_PLT32<<24,
 		'8' | R_386_GOTOFF<<24,
 		'8' | R_386_GOTPC<<24,
+		'8' | R_386_GOT32X<<24,
 		'9' | R_PPC64_REL24<<24:
 		*siz = 4
 
diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go
index d30bd48..6495385 100644
--- a/src/cmd/link/internal/x86/asm.go
+++ b/src/cmd/link/internal/x86/asm.go
@@ -78,7 +78,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
 
 		return
 
-	case 256 + ld.R_386_GOT32:
+	case 256 + ld.R_386_GOT32, 256 + ld.R_386_GOT32X:
 		if targ.Type != obj.SDYNIMPORT {
 			// have symbol
 			if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
-- 
2.6.2

Reply via email to