Задержка загрузки crypto ++ cryptopp.dll

Библиотека Crypto ++ поддерживает позднее связывание путем компиляции cryptlib.lib а также cryptopp.lib, Это требует использования cryptopp.dll, При попытке отложить загрузку этой DLL /DELAYLOAD:cryptopp.dll это вызывает ошибку связи, так как она не может быть задержана из-за необходимого импорта.

В качестве примера см. Следующий код:

#include <Crypto++/dll.h>
#include <crypto++/base64.h>

bool HexDecode(const std::string& strHex, std::string& strData)
{
try
{
CryptoPP::StringSource(strHex, true,
new CryptoPP::Base64Decoder(
new CryptoPP::StringSink(strData)));
}

catch(...)
{
return false;
}

return true;
}

Это вызывает следующую ошибку ссылки:

LINK : fatal error LNK1194: Delay loading "cryptopp.dll" not possible because of import of data symbol ""__declspec(dllimport) bool (__cdecl* CryptoPP::g_pAssignIntToInteger)(class type_info const &,void *,void const *)" (__imp_?g_pAssignIntToInteger@CryptoPP@@3P6A_NABVtype_info@@PAXPBX@ZA)". Link without /DELAYLOAD:cryptopp.dll

Кто-нибудь уже успел задержать загрузку cryptopp.dll успешно?

1

Решение

Библиотека Crypto ++ поддерживает позднее связывание путем компиляции с cryptlib.lib и cryptopp.lib …

DLL является библиотекой FIPS. Фактическая цель разделения функциональности на две отдельные библиотеки — предоставить границу логического модуля, требуемую FIPS 140-2. Граница модуля FIPS cryptopp.dll,

DLL FIPS включает в себя только алгоритмы FIPS, такие как AES и RSA. Я рекомендую вам избегать FIPS DLL любой ценой. С болью работать. Также см FIPS DLL на Crypto ++ вики.

Если вам нужна DLL, то напишите свою собственную DLL-оболочку со своим собственным API, а затем создайте ссылку на статическую библиотеку Crypto ++.

В случае оболочки DLL (и так как вы, кажется, опытный), я настоятельно рекомендую вам использовать cryptest.nmake в качестве отправной точки. Если вы знакомы с make-файлами (я так думаю), то вам будет гораздо проще работать с ними, чем Файлы проекта Visual Studio.


ССЫЛКА: фатальная ошибка LNK1194: задержка загрузки «cryptopp.dll» невозможна из-за импорта символа данных «» __declspec (dllimport) bool (__cdecl * CryptoPP :: g_pAssignIntToInteger) (класс type_info const &, void *, void const *) «(__imp_? g_pAssignIntToInteger @ CryptoPP @@ 3P6A_NABVtype_info @@ PAXPBX @ ZA)». Ссылка без /DELAYLOAD:cryptopp.dll

Это интересный вопрос, потому что у вас есть две библиотеки, и мне не ясно, в какой библиотеке находится символ. Первая библиотека — это FIPS DLL (cryptopp.dll), и она включает в себя AES, RSA и т. Д. Вторая библиотека Static Lib (cryptlib.lib) и включает в себя HexEncoder, FileSource и другие вспомогательные средства.

я верю g_pAssignIntToInteger должен быть в Static Lib (cryptlib.lib), потому что он был частью AlgorithmParamters, Смотрите, например, Совершить 5efb019d8bdc593b. Тем не менее, из вышеприведенной ошибки, кажется, находится в DLL FIPS из-за имени символа __imp_?g_pAssignIntToInteger ...,

Теперь добавлена ​​морщина, g_pAssignIntToInteger является указателем на функцию, и компиляторы не будут их оптимизировать. Так что компоновщик никогда не сбрасывает Integer связанные символы, который является точкой развязки.

В Совершить 0e55f5ac7d98f3c8 мы удалили g_pAssignIntToInteger и добавил определение CRYPTOPP_NO_ASSIGN_TO_INTEGER выполнить задачу. Определение обеспечивает символ и нежелательный код, такой как Integer код может быть отброшен.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]