]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/link: load host archive libc_nonshared.a for -fstack-protector
authorThan McIntosh <thanm@google.com>
Mon, 12 Dec 2022 16:04:05 +0000 (11:04 -0500)
committerThan McIntosh <thanm@google.com>
Tue, 31 Jan 2023 15:09:24 +0000 (15:09 +0000)
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>

src/cmd/link/internal/ld/lib.go
src/runtime/cgo/cgo.go

index 3b34e403582174d3c87e018fdc0f5f1d5102cd2e..17df56f4d53189591a747ab57ffb2527347a80a4 100644 (file)
@@ -630,6 +630,25 @@ func (ctxt *Link) loadlib() {
                        }
                        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)
+                                       }
+                               }
                        }
                }
        }
index b8473e532d4f7e75345a42cc30b01e5f380c569c..6d721bc8ffb883ea5b8007ddcf97cfc43e8d37ee 100644 (file)
@@ -23,9 +23,7 @@ package cgo
 #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