From 77319b6ab432693b07110615bdd96f4d192a2d3b Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 18 Jul 2026 08:27:27 -0400 Subject: [PATCH] fakecgo: use libthr.so.3 instead of libpthread.so on FreeBSD FreeBSD 15 removed the libpthread.so compatibility symlink to libthr.so from base. This caused Go binaries built with CGO_ENABLED=0 using purego's FreeBSD fakecgo path to have an unresolvable NEEDED entry for libpthread.so. libthr.so.3 is FreeBSD's actual threading implementation and has been present since at least FreeBSD 12.x. Updated gen.go and regenerated zsymbols_freebsd.go accordingly. Tested on FreeBSD 15.1-STABLE amd64: examples/libc builds and runs correctly with CGO_ENABLED=0, and readelf confirms the binary now links against libthr.so.3 instead of libpthread.so. --- internal/fakecgo/gen.go | 2 +- internal/fakecgo/zsymbols_freebsd.go | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/internal/fakecgo/gen.go b/internal/fakecgo/gen.go index 391b642e..c085a3dd 100644 --- a/internal/fakecgo/gen.go +++ b/internal/fakecgo/gen.go @@ -268,7 +268,7 @@ func run() error { pthreadSO = "/usr/lib/libSystem.B.dylib" case "freebsd": libcSO = "libc.so.7" - pthreadSO = "libpthread.so" + pthreadSO = "libthr.so.3" case "linux": libcSO = "libc.so.6" pthreadSO = "libpthread.so.0" diff --git a/internal/fakecgo/zsymbols_freebsd.go b/internal/fakecgo/zsymbols_freebsd.go index d6977559..11af74db 100644 --- a/internal/fakecgo/zsymbols_freebsd.go +++ b/internal/fakecgo/zsymbols_freebsd.go @@ -16,16 +16,16 @@ import "unsafe" //go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so.7" //go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so.7" //go:cgo_import_dynamic purego_abort abort "libc.so.7" -//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so" -//go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so" -//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so" -//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libpthread.so" -//go:cgo_import_dynamic purego_pthread_mutex_lock pthread_mutex_lock "libpthread.so" -//go:cgo_import_dynamic purego_pthread_mutex_unlock pthread_mutex_unlock "libpthread.so" -//go:cgo_import_dynamic purego_pthread_cond_broadcast pthread_cond_broadcast "libpthread.so" -//go:cgo_import_dynamic purego_pthread_setspecific pthread_setspecific "libpthread.so" -//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so" -//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so" +//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_create pthread_create "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_mutex_lock pthread_mutex_lock "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_mutex_unlock pthread_mutex_unlock "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_cond_broadcast pthread_cond_broadcast "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_setspecific pthread_setspecific "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libthr.so.3" +//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libthr.so.3" //go:nosplit //go:norace