gpt4 book ai didi

c++ - 延迟加载 crypto++ cryptopp.dll

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:26 26 4
gpt4 key购买 nike

Crypto++ 库通过针对 cryptlib.libcryptopp.lib 进行编译来支持后期绑定(bind)。这需要使用 cryptopp.dll。当尝试通过 /DELAYLOAD:cryptopp.dll 延迟加载此 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

最佳答案

The Crypto++ library supports late binding by compiling against cryptlib.lib and cryptopp.lib...

DLL 是 FIPS DLL。将功能拆分为两个单独的库的实际目的是提供 FIPS 140-2 所需的逻辑模块边界。 FIPS 模块边界是 cryptopp.dll

FIPS DLL 仅包含 FIPS 算法,如 AES 和 RSA。我建议您不惜一切代价避免使用 FIPS DLL。工作起来很痛苦。另见 FIPS DLL在 Crypto++ wiki 上。

如果你想要一个 DLL,然后用你自己的 API 编写你自己的包装器 DLL,然后链接到 Crypto++ 静态库。

在包装器 DLL 的情况下(因为你看起来很有经验),我强烈建议你使用 cryptest.nmake作为起点。如果您熟悉 makefile(我想您是),那么您会发现它比 Visual Studio project files 更容易使用。 .


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

这是一个有趣的问题,因为你有两个库,我不清楚符号在哪个库中。第一个库是 FIPS DLL (cryptopp.dll),它包括 AES、RSA 等。第二个库是静态库 (cryptlib.lib),它包括 HexEncoder、FileSource 和其他支持的东西。

我相信 g_pAssignIntToInteger 应该在静态库 (cryptlib.lib) 中,因为它是 AlgorithmParamters 的一部分。参见,例如,Commit 5efb019d8bdc593b .但是,从上面的错误来看,由于符号名称 __imp_?g_pAssignIntToInteger ...,它似乎驻留在 FIPS DLL 中。

现在增加的问题是,g_pAssignIntToInteger 是一个函数指针,编译器不会优化它们。所以链接器永远不会丢弃 Integer 相关的符号,这就是解耦的重点。

Commit 0e55f5ac7d98f3c8我们删除了 g_pAssignIntToInteger 并添加了定义 CRYPTOPP_NO_ASSIGN_TO_INTEGER 来完成任务。定义确保可以丢弃符号和不需要的代码,例如 Integer 代码。

关于c++ - 延迟加载 crypto++ cryptopp.dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com