如何使用emcc编译含longjmp的C代码并解决链接报错问题
问题解决方法
根本原因
Emscripten 2.0.12版本默认不开启setjmp/longjmp的支持,相关实现不会被默认编译进标准库。手动添加导出符号无效的原因是未开启对应特性时,标准库本身就不存在对应的符号,自然无法导出。
解决方案
编译时添加-s SUPPORT_LONGJMP=1参数即可正常编译,完整编译命令如下:
emcc -s SUPPORT_LONGJMP=1 longjmp.c -o longjmp.js
如果上述命令仍报错,可额外添加-s DISABLE_EXCEPTION_CATCHING=0参数:Debian bullseye源打包的Emscripten默认禁用了异常捕获,会影响该版本基于异常实现的longjmp逻辑。
验证方式
使用Node.js运行生成的js文件后,查看进程退出码即可确认运行正常:
node longjmp.js echo $? # 输出为33,和gcc编译的原生程序行为一致
注意事项
不要手动将缺失的longjmp相关符号添加到EXPORTED_FUNCTIONS,这类内部符号会在开启对应特性后自动被链接器引入。
内容的提问来源于stack exchange,提问作者Norman Ramsey
相关产品推荐
相关产品推荐

