Skip to content

Commit

Permalink
cmd/link: try libssp_nonshared.a when looking for "__stack_chk_fail_l…
Browse files Browse the repository at this point in the history
…ocal"

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 <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
  • Loading branch information
thanm committed Feb 10, 2023
1 parent 48f4728 commit c3d3be1
Showing 1 changed file with 24 additions and 18 deletions.
42 changes: 24 additions & 18 deletions src/cmd/link/internal/ld/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
}
Expand Down

0 comments on commit c3d3be1

Please sign in to comment.