首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟加载crypto++ cryptopp.dll

延迟加载crypto++ cryptopp.dll
EN

Stack Overflow用户
提问于 2017-08-02 21:46:53
回答 1查看 374关注 0票数 1

通过针对cryptlib.libcryptopp.lib进行编译,Crypto++库支持后期绑定。这需要使用cryptopp.dll。当尝试通过/DELAYLOAD:cryptopp.dll延迟加载此dll时,这会导致由于需要的导入而无法延迟加载此dll的链接错误。

例如,请参阅以下代码:

代码语言:javascript
复制
#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;
}

这会导致以下链接错误:

代码语言:javascript
复制
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了?

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 19:27:03

Crypto++库通过针对cryptlib.lib和cryptopp.lib进行编译来支持后期绑定...

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

FIPS DLL仅包括FIPS算法,如AES和RSA。我建议您不惜一切代价避免使用FIPS DLL。与之共事是一种痛苦。另请参阅Crypto++维基上的FIPS DLL

如果需要动态链接库,则使用自己的API编写自己的包装器动态链接库,然后链接到Crypto++静态库。

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

链接:致命错误LNK1194:由于导入数据符号“”cryptopp.dll(__declspec(Dllimport) bool (__cdecl* CryptoPP::g_pAssignIntToInteger)( type_info const &,__declspec *,void const *))“LNK1194,无法延迟加载"cryptopp.dll”不带/DELAYLOAD:cryptopp.dll的链接

这是一个有趣的问题,因为你有两个库,而我不清楚符号在哪个库中。第一个库是FIPS DLL (cryptopp.dll),它包括AES、RSA等。第二个库是Static Lib (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代码)可以被丢弃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45462728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档