From a95fde52433a33a69b04922466f056aeec1eea28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sun, 29 Mar 2026 18:52:05 +0800 Subject: [PATCH] fix: panic on non-ze system --- internal/zecall/zecall_linux.go | 8 ++++++-- internal/zecall/zecall_windows.go | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/zecall/zecall_linux.go b/internal/zecall/zecall_linux.go index bff28e0..854027a 100644 --- a/internal/zecall/zecall_linux.go +++ b/internal/zecall/zecall_linux.go @@ -21,14 +21,15 @@ func init() { } h, err := purego.Dlopen(zeLibraryName, purego.RTLD_LAZY|purego.RTLD_GLOBAL) if err != nil { - panic(err) + libZeLoader = ^uintptr(0) + return } libZeLoader = h } // Register a process for calling. For generated init only. Not thread-safe. func Register(name string) error { - if libZeLoader == 0 { + if libZeLoader == 0 || ^libZeLoader == 0 { return ErrZeCallNotInit } sym, err := purego.Dlsym(libZeLoader, name) @@ -45,6 +46,9 @@ func Register(name string) error { // //go:uintptrescapes func Syscall(name string, args ...uintptr) (r1, r2 uintptr, err error) { + if libZeLoader == 0 || ^libZeLoader == 0 { + return 0, 0, ErrZeCallNotInit + } fn, ok := procMap[name] if !ok { return 0, 0, ErrNoSuchProcess diff --git a/internal/zecall/zecall_windows.go b/internal/zecall/zecall_windows.go index 30492c2..5fc069f 100644 --- a/internal/zecall/zecall_windows.go +++ b/internal/zecall/zecall_windows.go @@ -10,6 +10,7 @@ const ( var ( libZeLoader *syscall.DLL + noZeLib = false procMap = map[string]*syscall.Proc{} ) @@ -19,14 +20,15 @@ func init() { } h, err := syscall.LoadLibrary(zeLibraryName) if err != nil { - panic(err) + noZeLib = true + return } libZeLoader = &syscall.DLL{Handle: h, Name: zeLibraryName} } // Register a process for calling. For generated init only. Not thread-safe. func Register(name string) error { - if libZeLoader == nil { + if libZeLoader == nil || noZeLib { return ErrZeCallNotInit } proc, err := libZeLoader.FindProc(name) @@ -43,6 +45,9 @@ func Register(name string) error { // //go:uintptrescapes func Syscall(name string, args ...uintptr) (r1, r2 uintptr, err error) { + if libZeLoader == nil || noZeLib { + return 0, 0, ErrZeCallNotInit + } fn, ok := procMap[name] if !ok { return 0, 0, ErrNoSuchProcess