You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译兼容FIPS 2.0.16的OpenSSL 1.0.2时测试阶段失败求助

解决OpenSSL 1.0.2t + FIPS 2.0.16编译测试目录报错问题

我来帮你解决这个OpenSSL 1.0.2t搭配FIPS 2.0.16编译时的测试组件链接问题。从报错信息来看,核心问题有两个:一是ssltestlib.o和dtlstest.o都定义了main函数导致多重定义冲突,二是部分测试函数找不到引用——这大概率是因为你用的gcc 9版本太新,和老旧的OpenSSL 1.0.2t代码兼容性不佳,或者测试组件本身在这个版本组合下有编译缺陷。下面给你几个可行的解决方案:

方法一:跳过测试程序编译(最简单高效)

如果你不需要编译OpenSSL的测试套件,只需要核心库功能,那么可以直接在配置时添加no-tests参数,彻底跳过测试组件的编译流程:

  1. 先彻底清理之前的编译残留文件:
make clean && make distclean
  1. 重新配置并编译:
./config fips no-shared no-tests --with-fipsdir=/home/dinesh/openssl-fips-install
make depend && make

这个方法能直接避开test目录的所有问题,主库的编译和FIPS模块的链接完全不受影响。编译完成后执行make install就能完成安装。

方法二:使用兼容的旧版本编译器

如果确实需要编译测试套件,那建议使用和OpenSSL 1.0.2t发布时期匹配的编译器版本(比如gcc 7或更早),新gcc版本的链接规则变化可能导致这类兼容性问题:

  1. 在SUSE系统上安装gcc 7(以zypper为例):
zypper install gcc7
  1. 指定gcc 7作为编译器重新配置编译:
CC=gcc7 ./config fips no-shared --with-fipsdir=/home/dinesh/openssl-fips-install
make depend && make

方法三:手动修复test目录的编译规则(进阶可选)

如果你想手动解决这个链接问题,可以修改test目录下的Makefile规则,解决main函数重复定义的问题:

  1. 进入test目录:
cd /home/dinesh/openssl-1.0.2t/test
  1. 找到dtlstest对应的编译规则,修改链接命令,移除ssltestlib.o(因为它包含了重复的main函数):
    将原来的规则:
dtlstest: dtlstest.o ssltestlib.o
        $(LDCMD) $(LDFLAGS) -o $@ dtlstest.o ssltestlib.o $(LIBDEPS)

修改为:

dtlstest: dtlstest.o
        $(LDCMD) $(LDFLAGS) -o $@ dtlstest.o $(LIBDEPS)
  1. 回到根目录重新执行make:
cd .. && make

不过这个方法可能需要处理其他测试程序的类似问题,整体效率不如前两种方法。

内容的提问来源于stack exchange,提问作者Dinesh Gowda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:04:10