1

cryptlib.libCrypto++ 库通过针对和编译来支持后期绑定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

4

1 回答 1

0

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

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

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

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

在包装 DLL 的情况下(并且因为您似乎很有经验),我强烈建议您将其cryptest.nmake用作起点。如果您熟悉 makefile(我想您是),那么您会发现它比Visual Studio 项目文件更容易使用。


链接:致命错误 LNK1194:由于导入数据符号“__declspec(dllimport) bool (__cdecl* CryptoPP::g_pAssignIntToInteger)(class type_info const &,void *,void const *)”而无法延迟加载“cryptopp.dll” (__imp_?g_pAssignIntToInteger@CryptoPP@@3P6A_NABVtype_info@@PAXPBX@ZA)”。没有 /DELAYLOAD:cryptopp.dll 的链接

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

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

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

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

于 2017-08-03T11:27:03.130 回答