From 69a99ccc6215334d3e4bec16c50dd6f19c2a3940 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Thu, 15 Oct 2015 21:48:11 +1300 Subject: [PATCH] cmd/link: always disable lazy PLT resolution when dynamically linking Go Go cannot allow lazy PLT resolution when calling between Go functions because the lazy resolution can use more stack than is available. Lazy resolution is disabled by passing -z now to the system linker, but unfortunately was only passed when linking to a Go shared library. That sounds fine, but the shared library containing the runtime is not linked to any other Go shared library but calls main.init and main.main via a PLT, and before this fix this did use lazy resolution. (For some reason this never caused a problem on intel, but it breaks on ppc64le). Fortunately the fix is very simple: always pass -z now to the system linker when dynamically linking Go. Change-Id: I7806d40aac80dcd1e56b95864d1cfeb1c42614e2 Reviewed-on: https://go-review.googlesource.com/15870 Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/lib.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 3ce22017cfe..8784e9d38f1 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1006,7 +1006,7 @@ func hostlink() { argv = append(argv, "-shared") } - if Linkshared && Iself { + if Iself && DynlinkingGo() { // We force all symbol resolution to be done at program startup // because lazy PLT resolution can use large amounts of stack at // times we cannot allow it to do so.