构建含OpenSSL的Rust静态库(musl)时sigsetjmp未定义引用问题
编译C++程序时遭遇
sigsetjmp未定义引用问题 错误详情
链接阶段出现以下错误:
/mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: /mnt/HDD/Project/inkbox-build/inkbox/inkbox-toreader/libs/Libretranslate-rs-to-cpp/lib//libLibretranslate_rs_to_cpp.a(armcap.o): in function `OPENSSL_cpuid_setup': armcap.c:(.text.startup.OPENSSL_cpuid_setup+0xa2): undefined reference to `sigsetjmp' /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: armcap.c:(.text.startup.OPENSSL_cpuid_setup+0xae): undefined reference to `sigsetjmp' /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: armcap.c:(.text.startup.OPENSSL_cpuid_setup+0xf4): undefined reference to `sigsetjmp' /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: armcap.c:(.text.startup.OPENSSL_cpuid_setup+0x100): undefined reference to `sigsetjmp' /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: armcap.c:(.text.startup.OPENSSL_cpuid_setup+0x10c): undefined reference to `sigsetjmp' /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: /mnt/HDD/Project/inkbox-build/inkbox/inkbox-toreader/libs/Libretranslate-rs-to-cpp/lib//libLibretranslate_rs_to_cpp.a(armcap.o):armcap.c:(.text.startup.OPENSSL_cpuid_setup+0x118): more undefined references to `sigsetjmp' follow collect2: error: ld returned 1 exit status make: *** [Makefile:505: build/inkbox] Error 1
已知线索
相关Bug信息显示:
glibc(至少2.17版本)没有
sigsetjmp函数实体,仅在特定条件下以宏的形式存在
当前使用的GLIBC版本并不老旧,且已尝试用zig编译本地非vendored的OpenSSL构建Rust库:
OPENSSL_DIR=/home/build/inkbox/openssl/ cargo zigbuild --target armv7-unknown-linux-musleabihf
但问题依旧。
解决方案
- 显式链接libc库:在C++程序的链接命令中添加
-lc参数,确保链接器能找到sigsetjmp的实现。musl libc中sigsetjmp是函数实体,静态链接时需显式依赖libc。 - 禁用OpenSSL的CPUID检测:编译OpenSSL时添加
no-cpuid配置选项,避免触发调用sigsetjmp的OPENSSL_cpuid_setup函数。例如:./Configure --prefix=/home/build/inkbox/openssl no-cpuid armv7-unknown-linux-musleabihf - 对齐目标环境:确认Rust库的编译目标(
armv7-unknown-linux-musleabihf)与C++程序的编译目标(arm-kobo-linux-gnueabihf)的libc类型一致,避免musl与glibc混合导致的符号不兼容。 - 强制启用glibc宏定义:在编译OpenSSL或Rust库时,定义
_GNU_SOURCE或_BSD_SOURCE宏,确保glibc的sigsetjmp宏被正确展开,替代函数调用。例如在Rust编译时添加环境变量:CFLAGS="-D_GNU_SOURCE" OPENSSL_DIR=/home/build/inkbox/openssl/ cargo zigbuild --target armv7-unknown-linux-musleabihf
内容的提问来源于stack exchange,提问作者Szybet
相关产品推荐
相关产品推荐

