【问题标题】:How can I build a DLL using the OpenSSL FIPS static library on Windows?如何在 Windows 上使用 OpenSSL FIPS 静态库构建 DLL?
【发布时间】:2014-12-10 20:14:37
【问题描述】:

我在 openssl-users 邮件列表上问过这个问题,但没有任何回复,所以我想我会在这里尝试。

我正在尝试构建一个包含静态 OpenSSL FIPS 库的 Windows DLL。我使用perl Configure fips --with-fipslibdir=... -no-sharednmake -f ms\nt.mak 构建了FIPS 库。我正在使用 openssl-fips-2.0.5、openssl-1.0.1j 和 MS Visual Studio 2010。

现在我正在尝试将生成的库链接到我的 DLL 中。我按照OpenSSL FIPS 2.0 User's Guide 中的说明设置了一堆环境变量(FIPS_LINK、FIPS_CC、FIPS_CC_ARGS 等),然后调用了fipslink.pl。但我遇到了“第一阶段链接失败”。

它报告“完整性检查正常”,然后编译 fips_premain.c,但是在链接 DLL 时,我收到一堆“本地定义的符号 _time64 导入”警告(以及 strncmp、_errno、abort、fprintf 等) ,然后是一些未解析的外部符号,包括:

__imp_strncpy
__imp_qsort
__imp_wcsstr
__imp_vsnwprintf

所有错误都来自 libeayfips32.lib、libeaycompat32.lib 和 ssleay32.lib。

我尝试过添加和删除/NODEFAULTLIB:msvcrt/NODEFAULTLIB:libcmtd 之类的内容,以及使用/MT/MD 或两者都不进行构建,但我每次都遇到链接器错误。我错过了什么?

【问题讨论】:

    标签: windows visual-studio-2010 linker openssl fips


    【解决方案1】:

    我推测配置脚本的“-no-shared”开关静态链接 C 标准库。您将获得静态 OpenSSL FIPS 库,但它会包含 printf 和朋友的实现,正如您实际体验的那样。

    【讨论】:

    • 也许这是真的,但它对我没有帮助。我可以构建一个共享版本(即 DLL),但我想构建一个静态库。
    【解决方案2】:

    打开文件ms\nt.mak,然后修改第28行,在末尾添加msvcrt.lib msvcrtd.lib,如下:

    EX_LIBS=ws2_32.lib gdi32.lib advapi32.lib crypt32.lib user32.lib msvcrt.lib msvcrtd.lib
    

    然后从 Visual Studio 命令提示符运行:nmake -f ms\nt.mak。我希望不会出现链接器消息。

    也尝试通过nmake -f ms\ntdll.mak 构建DLL

    【讨论】:

    • 这没什么区别。我可以成功构建一个 DLL,并且已经这样做了多年,但我想要一个静态库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多