From e7d72b6f5303dbd0184980f00fd26ea9503bf816 Mon Sep 17 00:00:00 2001 From: Aofei Sheng Date: Mon, 29 Jul 2024 08:58:13 +0800 Subject: [PATCH] build: fix `sigsetjmp` issues and ensure required libs on Linux 1. Handle `sigsetjmp` platform differences: - Separate `sigsetjmp` linkage to platform-specific files. - Use `__sigsetjmp` on Linux to handle `sigsetjmp` being a macro. - Maintain original implementation for Darwin. 2. Ensure linking of required libs: - Explicitly link against fundamental libs (e.g., libm, libatomic). - Address the fact that typical Linux linkers don't link these by default. --- c/setjmp/setjmp.go | 3 --- c/setjmp/setjmp_linux.go | 12 ++++++++++++ c/setjmp/setjmp_other.go | 12 ++++++++++++ internal/build/build.go | 2 ++ 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 c/setjmp/setjmp_linux.go create mode 100644 c/setjmp/setjmp_other.go diff --git a/c/setjmp/setjmp.go b/c/setjmp/setjmp.go index 89c6745a1..c4bccb189 100644 --- a/c/setjmp/setjmp.go +++ b/c/setjmp/setjmp.go @@ -44,9 +44,6 @@ func Longjmp(env *JmpBuf, val c.Int) // ----------------------------------------------------------------------------- -//go:linkname Sigsetjmp C.sigsetjmp -func Sigsetjmp(env *SigjmpBuf, savemask c.Int) c.Int - //go:linkname Siglongjmp C.siglongjmp func Siglongjmp(env *SigjmpBuf, val c.Int) diff --git a/c/setjmp/setjmp_linux.go b/c/setjmp/setjmp_linux.go new file mode 100644 index 000000000..17bad9161 --- /dev/null +++ b/c/setjmp/setjmp_linux.go @@ -0,0 +1,12 @@ +//go:build linux + +package setjmp + +import ( + _ "unsafe" + + "github.com/goplus/llgo/c" +) + +//go:linkname Sigsetjmp C.__sigsetjmp +func Sigsetjmp(env *SigjmpBuf, savemask c.Int) c.Int diff --git a/c/setjmp/setjmp_other.go b/c/setjmp/setjmp_other.go new file mode 100644 index 000000000..a83d513d8 --- /dev/null +++ b/c/setjmp/setjmp_other.go @@ -0,0 +1,12 @@ +//go:build !linux + +package setjmp + +import ( + _ "unsafe" + + "github.com/goplus/llgo/c" +) + +//go:linkname Sigsetjmp C.sigsetjmp +func Sigsetjmp(env *SigjmpBuf, savemask c.Int) c.Int diff --git a/internal/build/build.go b/internal/build/build.go index 6de1e0c4e..aa3b8b893 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -356,6 +356,8 @@ func linkMainPkg(ctx *context, pkg *packages.Package, pkgs []*aPackage, llFiles "-rpath", "$ORIGIN", "-rpath", "$ORIGIN/../lib", "-Xlinker", "--gc-sections", + "-lm", + "-latomic", "-lpthread", // libpthread is built-in since glibc 2.34 (2021-08-01); we need to support earlier versions. ) }