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