Создание и загрузка библиотек в 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 возможных типа загруки:

  1. из Python
 lib = ctypes.CDLL("./test.so")
 l = lib.DoubleIt(21)
 print(l)
 lib.PrintIt("sadasdsdas")

Вывод - DoubleIt - исполняется и выводит 42, PrintIt - AttributeError: function 'PrintIt' not found

  1. из 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

Ответы (0 шт):