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

构建含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:35:57