Создание и загрузка библиотек в go
Возникла проблема, которая раннее неоднократно поднималась и описана в документации, но по примеру оттуда - загрузка функции не работает.
Пусть есть файл который генерится в динамическую библиотеку. Код внутри выглядит так:
package main
import "C"
import "fmt"
//export DoubleIt
func DoubleIt(x int) int {
return x * 2
}
func PrintIt(message string) {
fmt.Println(message)
}
func main() {}
Компилирую в файл командой
go build -o test.so --buildmode=c-shared main.go
Далее пытаюсь загрузить библиотеку в коде. Использовал 2 возможных типа загруки:
- из Python
lib = ctypes.CDLL("./test.so")
l = lib.DoubleIt(21)
print(l)
lib.PrintIt("sadasdsdas")
Вывод - DoubleIt - исполняется и выводит 42, PrintIt - AttributeError: function 'PrintIt' not found
- из GO
var mod = syscall.NewLazyDLL("test.dll")
var proc = mod.NewProc("PrintIt")
ret, _, _ := proc.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("This test is Done."))))
fmt.Printf("Return: %d\n", ret)
Результат - panic: Failed to find PrintIt procedure in test.so: The specified procedure could not be found.
Почему не удается найти эту функцию?
UPD В Ответ на комментарий Daniel Protopopov прикладываю измененную ошибку. Пришлось немного переписать вызов функции с LazyDLL на LoadLibrary следующим образом. Почему-то LazyDll начал писать, что выполнение в среде Windows недоступно. Другой системы сейчас нет. Что странно - загрузка библиотеки корректна и адрес функции в библиотеке находится успешно. Ошибка возникает при попытке вызова функции
Новый вид загрузки
lib, err := syscall.LoadLibrary("test.dll")
if err != nil {
fmt.Println("Cannot load library")
}
log, err := syscall.GetProcAddress(lib, "PrintIt")
if err != nil {
fmt.Println("Cannot find proc in library")
}
str, _ := syscall.UTF16PtrFromString("test")
syscall.SyscallN(uintptr(log), uintptr(unsafe.Pointer(str)))
fatal error: bad sweepgen in refill
goroutine 1 [running, locked to thread]:
runtime.throw({0x7ffa52a36c5f?, 0xc0000719a8?})
C:/Program Files/Go/src/runtime/panic.go:1047 +0x65 fp=0xc000071988 sp=0xc000071958 pc=0x7ffa529a5005
runtime.(*mcache).refill(0x20c569e0108, 0x0?)
C:/Program Files/Go/src/runtime/mcache.go:156 +0x216 fp=0xc0000719c8 sp=0xc000071988 pc=0x7ffa52984936
runtime.(*mcache).nextFree(0x20c569e0108, 0x34)
C:/Program Files/Go/src/runtime/malloc.go:819 +0x85 fp=0xc000071a10 sp=0xc0000719c8 pc=0x7ffa5297bec5
runtime.mallocgc(0x200, 0x7ffa52a28aa0, 0x1)
C:/Program Files/Go/src/runtime/malloc.go:1018 +0x4c8 fp=0xc000071a88 sp=0xc000071a10 pc=0x7ffa5297c528
runtime.makeslice(0x0?, 0x0?, 0xc000071b28?)
C:/Program Files/Go/src/runtime/slice.go:103 +0x52 fp=0xc000071ab0 sp=0xc000071a88 pc=0x7ffa529b6f12
sync.(*Pool).pinSlow(0x7ffa52a13520)
C:/Program Files/Go/src/sync/pool.go:230 +0x185 fp=0xc000071b48 sp=0xc000071ab0 pc=0x7ffa529d5b25
sync.(*Pool).pin(0x7ffa52a13520)
C:/Program Files/Go/src/sync/pool.go:209 +0x4e fp=0xc000071b60 sp=0xc000071b48 pc=0x7ffa529d596e
sync.(*Pool).Get(0x7ffa52a13520)
C:/Program Files/Go/src/sync/pool.go:131 +0x25 fp=0xc000071b98 sp=0xc000071b60 pc=0x7ffa529d56a5
fmt.newPrinter()
C:/Program Files/Go/src/fmt/print.go:137 +0x25 fp=0xc000071bc0 sp=0xc000071b98 pc=0x7ffa529fab05
fmt.Fprintln({0x7ffa52a57178, 0x0}, {0xc000071c50, 0x1, 0x1})
C:/Program Files/Go/src/fmt/print.go:283 +0x36 fp=0xc000071c10 sp=0xc000071bc0 pc=0x7ffa529fadd6
fmt.Println(...)
C:/Program Files/Go/src/fmt/print.go:294
main.Log({0x74007300650074?, 0xc000071cd0})
C:/Users/Arr/Documents/basic/github/Pyhton_tsts/test.go:34 +0xe6 fp=0xc000071c88 sp=0xc000071c10 pc=0x7ffa52a00406
_cgoexp_12513105e89f_Log(0xbf767ff980)
_cgo_gotypes.go:68 +0x28 fp=0xc000071ca8 sp=0xc000071c88 pc=0x7ffa52a00608
runtime.cgocallbackg1(0x7ffa52a005e0, 0x100c000071d98?, 0x0)
C:/Program Files/Go/src/runtime/cgocall.go:316 +0x2c2 fp=0xc000071d78 sp=0xc000071ca8 pc=0x7ffa52974042
runtime.cgocallbackg(0xc000034000?, 0x300000002?, 0xc000034000?)
C:/Program Files/Go/src/runtime/cgocall.go:235 +0x105 fp=0xc000071e08 sp=0xc000071d78 pc=0x7ffa52973c85
runtime.cgocallbackg(0x7ffa52a005e0, 0xbf767ff980, 0x0)
<autogenerated>:1 +0x36 fp=0xc000071e30 sp=0xc000071e08 pc=0x7ffa529d0756
runtime: g 1: unexpected return pc for runtime.cgocallback called from 0x7ff7430bc500
stack: frame={sp:0xc000071e30, fp:0xc000071e58} stack=[0xc00006a000,0xc000072000)
0x000000c000071d30: 0x000000c000071ced 0x000000c000034000
0x000000c000071d40: 0x0000000200000003 0x000000c000034000
0x000000c000071d50: 0x000000c000071d28 0x0000000000000000
0x000000c000071d60: 0x00007ffa52a3d160 0x000000c000071df8
0x000000c000071d70: 0x00007ffa52973c85 <runtime.cgocallbackg+0x0000000000000105> 0x00007ffa52a005e0 <_cgoexp_12513105e89f_Log+0x0000000000000000>
0x000000c000071d80: 0x000100c000071d98 0x0000000000000000
0x000000c000071d90: 0x00007ff743063b8a 0x0000000000000000
0x000000c000071da0: 0x00007ffa52a00740 0x0000000000000001
0x000000c000071db0: 0x000000c000071ed0 0x00007ffa52a00740
0x000000c000071dc0: 0x0000000000000000 0x0000000000000000
0x000000c000071dd0: 0x000000c000071e60 0x000000c000034000
0x000000c000071de0: 0x00007ff7431ad1e0 0x00007ffa52a005e0 <_cgoexp_12513105e89f_Log+0x0000000000000000>
0x000000c000071df0: 0x000000bf767ff980 0x000000c000071e20
0x000000c000071e00: 0x00007ffa529d0756 <runtime.cgocallbackg+0x0000000000000036> 0x000000c000034000
0x000000c000071e10: 0x0000000300000002 0x000000c000034000
0x000000c000071e20: 0x000000bf767ff848 0x00007ffa529ce517 <runtime.cgocallback+0x00000000000000d7>
0x000000c000071e30: <0x00007ffa52a005e0 <_cgoexp_12513105e89f_Log+0x0000000000000000> 0x000000bf767ff980
0x000000c000071e40: 0x0000000000000000 0x000000c000071e60
0x000000c000071e50: !0x00007ff7430bc500 >0x00007ff743063beb
0x000000c000071e60: 0x00007ff7430c0100 0x00007ff7431ad4a0
0x000000c000071e70: 0x000000c000018088 0x0000000000000000
0x000000c000071e80: 0x00007ff7431ad1e0 0x000000c000071f00
0x000000c000071e90: 0x00007ff7430bb5c9 0x00007ff7430c0100
0x000000c000071ea0: 0x00007ff7431ad4a0 0x0000020c569e0108
0x000000c000071eb0: 0x0100000000000010 0x0000000000000000
0x000000c000071ec0: 0x0000000000000000 0x0000000000000000
0x000000c000071ed0: 0x000000c0000180d0 0x0000000000000000
0x000000c000071ee0: 0x0000000000000000 0x0000000000000000
0x000000c000071ef0: 0x00007ff7431ad1e0 0x00007ff74312e198
0x000000c000071f00: 0x000000c000071f70 0x00007ff7430f0a05
0x000000c000071f10: 0x00007ffa52a00740 0x000000c0000180e0
0x000000c000071f20: 0x0000000000000001 0x000000c000034000
0x000000c000071f30: 0x000000c000071f70 0x00007ffa52a00740
0x000000c000071f40: 0x00007ff743063c27 0x000000c0000180d0
0x000000c000071f50: 0x0000000000000000
runtime.cgocallback(0x7ff743063beb, 0x7ff7430c0100, 0x7ff7431ad4a0)
C:/Program Files/Go/src/runtime/asm_amd64.s:994 +0xd7 fp=0xc000071e58 sp=0xc000071e30 pc=0x7ffa529ce517
goroutine 1 [runnable, locked to thread]:
runtime.gcTrigger.test({0x0?, 0x0?, 0x0?})
C:/Program Files/Go/src/runtime/mgc.go:548 +0xfc fp=0x1c00009b5c0 sp=0x1c00009b5b8 pc=0x7ffa5298769c
runtime.mallocgc(0x3e, 0x7ffa52a21ea0, 0x1)
C:/Program Files/Go/src/runtime/malloc.go:1147 +0x809 fp=0x1c00009b638 sp=0x1c00009b5c0 pc=0x7ffa5297c869
runtime.makeslice(0x2070000?, 0x1c00009b7d0?, 0x1f?)
C:/Program Files/Go/src/runtime/slice.go:103 +0x52 fp=0x1c00009b660 sp=0x1c00009b638 pc=0x7ffa529b6f12
unicode/utf16.Encode({0x1c00009b6e0, 0x1c00009b6c0?, 0x1f?})
C:/Program Files/Go/src/unicode/utf16/utf16.go:64 +0x5b fp=0x1c00009b698 sp=0x1c00009b660 pc=0x7ffa529d68bb
syscall.UTF16FromString({0x1c00009b7d0, 0x1e})
C:/Program Files/Go/src/syscall/syscall_windows.go:46 +0xca fp=0x1c00009b770 sp=0x1c00009b698 pc=0x7ffa529d80ea
syscall.UTF16PtrFromString(...)
C:/Program Files/Go/src/syscall/syscall_windows.go:96
syscall.LoadDLL({0x7ffa52a33eb7, 0xa})
C:/Program Files/Go/src/syscall/dll_windows.go:92 +0xbc fp=0x1c00009b818 sp=0x1c00009b770 pc=0x7ffa529d761c
syscall.(*LazyDLL).Load(0x1c00008e160)
C:/Program Files/Go/src/syscall/dll_windows.go:218 +0xa5 fp=0x1c00009b868 sp=0x1c00009b818 pc=0x7ffa529d7c05
syscall.(*LazyProc).Find(0x1c00008b950)
C:/Program Files/Go/src/syscall/dll_windows.go:273 +0xa5 fp=0x1c00009b8c0 sp=0x1c00009b868 pc=0x7ffa529d7dc5
syscall.(*LazyProc).mustFind(...)
C:/Program Files/Go/src/syscall/dll_windows.go:291
syscall.(*LazyProc).Addr(...)
C:/Program Files/Go/src/syscall/dll_windows.go:300
syscall.WSAStartup(0x202, 0x1c00008e240?)
C:/Program Files/Go/src/syscall/zsyscall_windows.go:1327 +0x36 fp=0x1c00009b908 sp=0x1c00009b8c0 pc=0x7ffa529d9556
internal/poll.init.0()
C:/Program Files/Go/src/internal/poll/fd_windows.go:58 +0x65 fp=0x1c00009bac0 sp=0x1c00009b908 pc=0x7ffa529f5825
runtime.doInit(0x7ffa52a04c40)
C:/Program Files/Go/src/runtime/proc.go:6329 +0x12d fp=0x1c00009bbf0 sp=0x1c00009bac0 pc=0x7ffa529b41cd
runtime.doInit(0x7ffa52a05780)
C:/Program Files/Go/src/runtime/proc.go:6306 +0x71 fp=0x1c00009bd20 sp=0x1c00009bbf0 pc=0x7ffa529b4111
runtime.doInit(0x7ffa52a04e20)
C:/Program Files/Go/src/runtime/proc.go:6306 +0x71 fp=0x1c00009be50 sp=0x1c00009bd20 pc=0x7ffa529b4111
runtime.doInit(0x7ffa52a04280)
C:/Program Files/Go/src/runtime/proc.go:6306 +0x71 fp=0x1c00009bf80 sp=0x1c00009be50 pc=0x7ffa529b4111
runtime.main()
C:/Program Files/Go/src/runtime/proc.go:233 +0x1bf fp=0x1c00009bfe0 sp=0x1c00009bf80 pc=0x7ffa529a76ff
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1594 +0x1 fp=0x1c00009bfe8 sp=0x1c00009bfe0 pc=0x7ffa529ce781
goroutine 2 [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
C:/Program Files/Go/src/runtime/proc.go:363 +0xd6 fp=0x1c000037fb0 sp=0x1c000037f90 pc=0x7ffa529a7ad6
runtime.goparkunlock(...)
C:/Program Files/Go/src/runtime/proc.go:369
runtime.forcegchelper()
C:/Program Files/Go/src/runtime/proc.go:302 +0xb1 fp=0x1c000037fe0 sp=0x1c000037fb0 pc=0x7ffa529a7971
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1594 +0x1 fp=0x1c000037fe8 sp=0x1c000037fe0 pc=0x7ffa529ce781
created by runtime.init.6
C:/Program Files/Go/src/runtime/proc.go:290 +0x25
goroutine 3 [GC sweep wait]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
C:/Program Files/Go/src/runtime/proc.go:363 +0xd6 fp=0x1c000039f90 sp=0x1c000039f70 pc=0x7ffa529a7ad6
runtime.goparkunlock(...)
C:/Program Files/Go/src/runtime/proc.go:369
runtime.bgsweep(0x0?)
C:/Program Files/Go/src/runtime/mgcsweep.go:278 +0x8e fp=0x1c000039fc8 sp=0x1c000039f90 pc=0x7ffa5299270e
runtime.gcenable.func1()
C:/Program Files/Go/src/runtime/mgc.go:178 +0x26 fp=0x1c000039fe0 sp=0x1c000039fc8 pc=0x7ffa529874a6
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1594 +0x1 fp=0x1c000039fe8 sp=0x1c000039fe0 pc=0x7ffa529ce781
created by runtime.gcenable
C:/Program Files/Go/src/runtime/mgc.go:178 +0x6b
goroutine 4 [GC scavenge wait]:
runtime.gopark(0x1c000042000?, 0x7ffa52a56c00?, 0x1?, 0x0?, 0x0?)
C:/Program Files/Go/src/runtime/proc.go:363 +0xd6 fp=0x1c000049f70 sp=0x1c000049f50 pc=0x7ffa529a7ad6
runtime.goparkunlock(...)
C:/Program Files/Go/src/runtime/proc.go:369
runtime.(*scavengerState).park(0x7ffa52abbdc0)
C:/Program Files/Go/src/runtime/mgcscavenge.go:389 +0x53 fp=0x1c000049fa0 sp=0x1c000049f70 pc=0x7ffa52990793
runtime.bgscavenge(0x0?)
C:/Program Files/Go/src/runtime/mgcscavenge.go:617 +0x45 fp=0x1c000049fc8 sp=0x1c000049fa0 pc=0x7ffa52990d85
runtime.gcenable.func2()
C:/Program Files/Go/src/runtime/mgc.go:179 +0x26 fp=0x1c000049fe0 sp=0x1c000049fc8 pc=0x7ffa52987446
runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1594 +0x1 fp=0x1c000049fe8 sp=0x1c000049fe0 pc=0x7ffa529ce781
created by runtime.gcenable
C:/Program Files/Go/src/runtime/mgc.go:179 +0xaa
exit status 2