У меня есть бинарный код go (давайте назовем A) с использованием двух dll (B и C) через cgo. Обе библиотеки DLL написаны на языке C ++ и не зависят от библиотек Windows, поэтому для любых библиотек winapi не было установлено никаких явных ссылок.
cgo использует migw 4.9.2 для его компиляции.
Проблема есть; когда я компилирую и запускаю A, он не может начать говорить «… CryptReleaseContext не может быть расположен в библиотеке динамических ссылок …».
Я вижу ходячего в зависимости;
только «B» -> зависит от Advapi32.dll.
только «C» -> зависит от Advapi32.dll.
«A» (исполняемый файл go) -> также зависит от Advapi32.dll. Ну и конечно же Б и С.
В этом контексте «А», когда я нажимаю на зависимости;
C -> имеет функции, которые я действительно использую в списке. Advapi32.dll является также перечислены в зависимостях с 3 функциями, перечисленными как используемые в нем. но CryptAcquireContextW, CryptGenRandom, CryptReleaseContext выглядит как неразрешенные функции на уровне библиотеки C.
B -> эти три функции там вообще не перечислены, но реальный контент указан правильно.
Итак, мой вопрос: почему эти 3 функции winapi, похоже, определены в библиотеке «C». Как один из них, когда я проверяю Advapi32.dll, я также вижу, что эти 3 функции определены в нем и уже используются.
Другой вопрос, так как они являются функциями c без искажения или декорирования, почему их нельзя найти в контексте A.exe во время выполнения, разрешенного из Advapi32.dll?
Поскольку и B, и C имеют одинаковые флаги компиляции / компоновщика, я подозреваю, что здесь кое-что о cgo.
Следующее — лучший вид объяснения выше. Любые идеи приветствуются.
Dump of file A.exe
File Type: EXECUTABLE IMAGE
Section contains the following imports:
ADVAPI32.dll
9B0818 Import Address Table
9B00F4 Import Name Table
0 time date stamp
0 Index of first forwarder reference
B.dll
9B0B20 Import Address Table
9B0400 Import Name Table
0 time date stamp
0 Index of first forwarder reference
54C correct_function_from_B
C.dll
9B0EB8 Import Address Table
9B0798 Import Name Table
0 time date stamp
0 Index of first forwarder reference
31 correct_function_from_C
DB CryptReleaseContext
D1 CryptGenRandom
C1 CryptAcquireContextW
`
Задача ещё не решена.
Других решений пока нет …