cmd/link: load host archive libc_nonshared.a for -fstack-protector

For internal linking, at the point where we finish reading libgcc.a,
if the symbol "__stack_chk_local" is still undefined, then read
in the host archive libc_nonshared.a as well.

Updates #57261.

Change-Id: I0b1e485aa50aa7940db8cabcb3b9a7959bf99ce7
Reviewed-on: https://go-review.googlesource.com/c/go/+/456856
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go
index 3b34e40..17df56f 100644
--- a/src/cmd/link/internal/ld/lib.go
+++ b/src/cmd/link/internal/ld/lib.go
@@ -630,6 +630,25 @@
 			}
 			if *flagLibGCC != "none" {
 				hostArchive(ctxt, *flagLibGCC)
+				// For glibc systems, the linker setup used by GCC
+				// looks like
+				//
+				//  GROUP ( /lib/x86_64-linux-gnu/libc.so.6
+				//      /usr/lib/x86_64-linux-gnu/libc_nonshared.a
+				//      AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
+				//
+				// where libc_nonshared.a contains a small set of
+				// symbols including "__stack_chk_fail_local" and a
+				// few others. Thus if we are doing internal linking
+				// and "__stack_chk_fail_local" is unresolved (most
+				// likely due to the use of -fstack-protector), try
+				// loading libc_nonshared.a to resolve it.
+				isunresolved := symbolsAreUnresolved(ctxt, []string{"__stack_chk_fail_local"})
+				if isunresolved[0] {
+					if p := ctxt.findLibPath("libc_nonshared.a"); p != "none" {
+						hostArchive(ctxt, p)
+					}
+				}
 			}
 		}
 	}
diff --git a/src/runtime/cgo/cgo.go b/src/runtime/cgo/cgo.go
index b8473e5..6d721bc 100644
--- a/src/runtime/cgo/cgo.go
+++ b/src/runtime/cgo/cgo.go
@@ -23,9 +23,7 @@
 #cgo solaris LDFLAGS: -lxnet
 #cgo solaris LDFLAGS: -lsocket
 
-// We use -fno-stack-protector because internal linking won't find
-// the support functions. See issues #52919 and #54313.
-#cgo CFLAGS: -Wall -Werror -fno-stack-protector
+#cgo CFLAGS: -Wall -Werror
 
 #cgo solaris CPPFLAGS: -D_POSIX_PTHREAD_SEMANTICS