mbedtls entropy初始化触发段错误问题求助
我之前在基于mbedtls的项目里也碰到过完全一样的问题——预编译的示例能正常跑,自己编译就触发段错误,大概率是编译环节没处理好mbedtls的依赖,给你梳理几个最可能的原因和解决办法:
未链接mbedtls核心库:预编译的可执行文件已经把mbedtls的三个核心库(crypto、x509、tls)打包进去了,但你直接用
gcc -o new_gen_entropy gen_entropy.c编译时,只编译了源文件本身,没有链接依赖的库。正确的编译命令需要加上库链接参数:gcc -o new_gen_entropy gen_entropy.c -lmbedtls -lmbedx509 -lmbedcrypto如果你的mbedtls不是安装在系统默认路径(比如自己手动编译的),还要用
-L指定库文件路径,-I指定头文件路径:gcc -o new_gen_entropy gen_entropy.c -I/path/to/mbedtls/include -L/path/to/mbedtls/library -lmbedtls -lmbedx509 -lmbedcrypto库版本或配置不匹配:预编译示例依赖的mbedtls配置可能和你当前使用的库不一致,比如某些必要的宏(如
MBEDTLS_ENTROPY_C)没开启,导致熵上下文结构初始化异常。可以检查mbedtls的config.h文件,确保开启了熵模块相关的配置选项,或者重新编译mbedtls时保持和示例一致的配置。平台熵源初始化失败:不同平台的熵源获取方式不同,比如Linux依赖
/dev/urandom,如果mbedtls编译时没有启用对应的熵源支持(比如MBEDTLS_ENTROPY_DEVICE_FILE_ENABLE),会导致熵上下文初始化时访问非法内存触发段错误。可以在编译mbedtls时确认开启了对应平台的熵源配置。
另外,编译完成后可以用ldd new_gen_entropy检查可执行文件的依赖库是否能正常找到,如果出现某个mbedtls库找不到的提示,就说明库路径没配置对。
内容的提问来源于stack exchange,提问作者Yann Lelong

