使用OpenSSL函数的nwipe项目在Ubuntu编译失败但Fedora成功
nwipe编译跨发行版差异问题:Fedora成功Ubuntu链接失败
问题描述
编译nwipe项目时,Fedora系统无报错完成构建,但相同OpenSSL版本(≥3.0.2)的Ubuntu机器出现链接错误,两台系统均已正确安装libdev-ssl依赖包。
Fedora编译成功的关键命令片段:
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -MT aes/aes_ctr_prng.o -MD -MP -MF $depbase.Tpo -c -o aes/aes_ctr_prng.o aes/aes_ctr_prng.c &&\ mv -f $depbase.Tpo $depbase.Po ... gcc -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -lcrypto -o nwipe nwipe.o ... -lparted -lpthread -lpanel -lncurses -ltinfo -lconfig
Ubuntu上的链接错误:
/usr/bin/ld: aes/aes_ctr_prng.o: in function `aes_ctr_prng_init': /tmp/nwipe/src/aes/aes_ctr_prng.c:22: undefined reference to `AES_set_encrypt_key' /usr/bin/ld: aes/aes_ctr_prng.o: in function `aes_ctr_prng_genrand_uint32': /tmp/nwipe/src/aes/aes_ctr_prng.c:41: undefined reference to `AES_encrypt' /usr/bin/ld: /tmp/nwipe/src/aes/aes_ctr_prng.c:41: undefined reference to `CRYPTO_ctr128_encrypt' collect2: error: ld returned 1 exit status
原因分析
尽管OpenSSL版本一致,但Fedora与Ubuntu的OpenSSL打包策略存在差异:
- Fedora的libcrypto库默认保留了OpenSSL 3.x中标记为弃用的传统AES、EVP函数符号
- Ubuntu在OpenSSL 3.x的打包中,将弃用函数符号默认隐藏,需通过显式编译宏或链接选项才能启用
- 链接器参数顺序也可能引发问题:若
-lcrypto放在目标文件之前,链接器无法正确解析符号
解决方法
调整链接库顺序:确保
-lcrypto放在所有目标文件之后,示例编译命令:gcc -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -o nwipe nwipe.o ... -lparted -lpthread -lpanel -lncurses -ltinfo -lconfig -lcrypto添加兼容宏定义:编译时加入
-DOPENSSL_API_COMPAT=0x10100000L(对应OpenSSL 1.1.0 API兼容级别),强制暴露弃用函数:- 直接修改Makefile,在CFLAGS中追加该参数
- 或重新运行configure时指定:
./configure CFLAGS="-DOPENSSL_API_COMPAT=0x10100000L"
安装兼容库:若Ubuntu提供单独的OpenSSL兼容包(如
libssl3-compat),先安装该包再重新编译源码适配修改:若上述方法无效,可修改
aes_ctr_prng.c,将弃用的AES函数替换为OpenSSL 3.x推荐的EVP接口
内容的提问来源于stack exchange,提问作者FBDIMM
相关产品推荐
相关产品推荐

