]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: try libssp_nonshared.a when looking for "__stack_chk_fail_local"
authorThan McIntosh <thanm@google.com>
Thu, 9 Feb 2023 16:37:13 +0000 (11:37 -0500)
committerThan McIntosh <thanm@google.com>
Fri, 10 Feb 2023 14:49:35 +0000 (14:49 +0000)
Update the code that tries to satisfy unresolved references to
"__stack_chk_fail_local" to look for "libssp_nonshared.a" in addition
to "libc_nonshared.a" (the former archive is the correct place on
Alpine).

Updates #52919.
Updates #54313.
Updates #57261.
Fixes #58385.

Change-Id: Id6cd3ebb4d5388df50a838e6efa5e5b683545b01
Reviewed-on: https://go-review.googlesource.com/c/go/+/466936
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

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

index 3772b8ba9092478677ddd355a5a75407540b5365..baca7cd65f95895fb097770580ee7e0259053abd 100644 (file)
@@ -630,24 +630,30 @@ 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)
-                                       }
+                       }
+                       // 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.
+                       //
+                       // On Alpine Linux (musl-based), the library providing
+                       // this symbol is called libssp_nonshared.a.
+                       isunresolved := symbolsAreUnresolved(ctxt, []string{"__stack_chk_fail_local"})
+                       if isunresolved[0] {
+                               if p := ctxt.findLibPath("libc_nonshared.a"); p != "none" {
+                                       hostArchive(ctxt, p)
+                               }
+                               if p := ctxt.findLibPath("libssp_nonshared.a"); p != "none" {
+                                       hostArchive(ctxt, p)
                                }
                        }
                }