Windows平台编译BoringSSL x64时遇链接错误求助
问题
在Windows平台编译BoringSSL时,x32版本可正常构建,但在CMake的C/C++编译选项中添加-m64编译x64版本时,出现链接错误,缺失两个符号:fiat_p256_adx_sqr和fiat_p256_adx_mul。
错误信息如下:
ld.lld: error: undefined symbol: fiat_p256_adx_sqr
libcrypto.a(bcm.c.obj):(fiat_p256_square)
ld.lld: error: undefined symbol: fiat_p256_adx_mul
libcrypto.a(bcm.c.obj):(fiat_p256_mul)
查看代码后发现,这两个缺失的符号定义在如下条件判断块内:
#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && (defined(__APPLE__) || defined(__ELF__)) ... #endif
由于Windows平台既不是__APPLE__也不是__ELF__,所以对应的汇编代码(.S文件)不会被编译,导致链接时找不到符号。请问是否遗漏了配置,还是BoringSSL在Windows下必须添加-DOPENSSL_NO_ASM才能支持?
回答
BoringSSL在Windows x64平台下编译时,确实会遇到这个问题——因为x64版本的Fiat P-256汇编优化代码仅针对ELF(类Linux系统)和Apple平台做了适配,Windows的PE格式不在当前的编译条件范围内,所以对应的fiat_p256_adx_sqr和fiat_p256_adx_mul符号不会被编译出来。
解决方法有两种:
- 禁用汇编优化:在CMake配置时添加
-DOPENSSL_NO_ASM=ON,这样BoringSSL会自动回退到纯C实现的P-256运算逻辑,避免链接错误。这是最直接的解决方案,适合不需要极致性能的场景。 - 适配Windows汇编编译:如果需要保留汇编优化,需要修改BoringSSL的编译条件,在判断中加入Windows平台的宏(比如
_WIN64),同时确保汇编代码能被Windows的汇编器(比如ML64)正确处理。不过这种方法需要修改BoringSSL的源码,并且要验证汇编代码的兼容性,适合有一定底层开发经验的用户。
一般来说,推荐第一种方法,即添加-DOPENSSL_NO_ASM=ON来快速解决链接问题,除非你对性能有极高要求,否则纯C实现已经足够满足大多数场景的需求。
内容的提问来源于stack exchange,提问作者MuaazH
相关产品推荐
相关产品推荐

