From 4f18e62ff386459a27a9430615475e218a90bc61 Mon Sep 17 00:00:00 2001 From: Jakub Čajka Date: May 13 2021 14:51:32 +0000 Subject: Fix linker issue on ppc64le --- diff --git a/golang.spec b/golang.spec index babb461..1e09b52 100644 --- a/golang.spec +++ b/golang.spec @@ -109,11 +109,11 @@ %global go_version 1.16.4 # For rpmdev-bumpspec and releng automation -%global baserelease 1 +%global baserelease 2 Name: golang Version: %{go_version} -Release: 1%{?dist} +Release: %baserelease%{?dist} Summary: The Go Programming Language # source tree includes several copies of Mark.Twain-Tom.Sawyer.txt under Public Domain License: BSD and Public Domain @@ -158,6 +158,8 @@ Requires: go-srpm-macros Patch1: 0001-Don-t-use-the-bundled-tzdata-at-runtime-except-for-t.patch Patch2: 0002-syscall-expose-IfInfomsg.X__ifi_pad-on-s390x.patch Patch3: 0003-cmd-go-disable-Google-s-proxy-and-sumdb.patch +# Scheduled backport for go1.16 https://golang.org/cl/316750 by laboger +Patch4: ppc64x-linker-fix.patch # Having documentation separate was broken Obsoletes: %{name}-docs < 1.1-4 @@ -529,6 +531,9 @@ fi %endif %changelog +* Thu May 13 2021 Jakub Čajka - 1.16.4-2 +- Fix linker issue on ppc64le breaking kube 1.21 build + * Mon May 10 2021 Alejandro Sáez - 1.16.4-1 - Update to go1.16.4 - Security fix for CVE-2021-31525 diff --git a/ppc64x-linker-fix.patch b/ppc64x-linker-fix.patch new file mode 100644 index 0000000..599912b --- /dev/null +++ b/ppc64x-linker-fix.patch @@ -0,0 +1,70 @@ +From 714d86f88554329d7f134dee318f57c6c0b524a7 Mon Sep 17 00:00:00 2001 +From: Lynn Boger +Date: Thu, 29 Apr 2021 16:07:25 -0500 +Subject: [PATCH] [release-branch.go1.16] cmd/link/internal: fix use of DynlinkingGo with ppc64le trampolines + +When creating programs with large text sections on ppc64le, +trampolines are needed for calls that are too far; however +they are not created if the code is generated such that the TOC +register r2 is initialized and maintained in the code because +then the external linker can create the trampolines. Previously +the function DynlinkingGo was used to determine this but in the +case where plugins are used, this could return true even though +r2 is not valid. + +To fix this problem I've added a new function r2Valid which returns +true when the build options indicate that the r2 is +initialized and maintained. Because of the ways that +DynlinkingGo is used I wanted to maintain its previous +behavior. + +Fixes #45927 + +Change-Id: I6d902eba6ad41757aa6474948b79acdbd479cb38 +Reviewed-on: https://go-review.googlesource.com/c/go/+/315289 +Trust: Lynn Boger +Run-TryBot: Lynn Boger +Reviewed-by: Cherry Zhang +TryBot-Result: Go Bot +(cherry picked from commit 9ed736ac2a99aa2e7ef7d8bed3b01ca8b20a6f80) +--- + +diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go +index 602f0b5..539afac 100644 +--- a/src/cmd/link/internal/ppc64/asm.go ++++ b/src/cmd/link/internal/ppc64/asm.go +@@ -642,6 +642,16 @@ + return int64(o2)<<32 | int64(o1) + } + ++// Determine if the code was compiled so that the TOC register R2 is initialized and maintained ++func r2Valid(ctxt *ld.Link) bool { ++ switch ctxt.BuildMode { ++ case ld.BuildModeCArchive, ld.BuildModeCShared, ld.BuildModePIE, ld.BuildModeShared, ld.BuildModePlugin: ++ return true ++ } ++ // -linkshared option ++ return ctxt.IsSharedGoLink() ++} ++ + // resolve direct jump relocation r in s, and add trampoline if necessary + func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { + +@@ -649,7 +659,7 @@ + // For internal linking, trampolines are always created for long calls. + // For external linking, the linker can insert a call stub to handle a long call, but depends on having the TOC address in + // r2. For those build modes with external linking where the TOC address is not maintained in r2, trampolines must be created. +- if ctxt.IsExternal() && (ctxt.DynlinkingGo() || ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE) { ++ if ctxt.IsExternal() && r2Valid(ctxt) { + // No trampolines needed since r2 contains the TOC + return + } +@@ -703,7 +713,7 @@ + } + } + if ldr.SymType(tramp) == 0 { +- if ctxt.DynlinkingGo() || ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE { ++ if r2Valid(ctxt) { + // Should have returned for above cases + ctxt.Errorf(s, "unexpected trampoline for shared or dynamic linking") + } else {