Alpine Linux 3.12构建Elixir、BEAM符号缺失报错问题咨询
故障根因
这两个报错本质就是基础依赖版本过旧、版本不匹配导致的,和构建脚本的业务逻辑无关,两个缺失符号的具体诱因:
_ZSt28__throw_bad_array_new_lengthv符号缺失:该符号是GCC 11及以上版本libstdc导出的标准库符号,Alpine 3.12默认搭载的GCC版本为9.x,自带的libstdc没有实现这个符号。如果构建时混用了高版本GCC编译的C++依赖,或者直接拿高版本环境预编译好的ERTS二进制包放到3.12环境跑,就会触发这个重定位错误。pthread_getname_np符号缺失:这个pthread扩展接口是musl libc 1.2.0之后才正式加入的,Alpine 3.12默认带的musl版本是1.1.24,根本没实现这个接口,运行时自然找不到对应符号。
修复方案
- 最稳妥无坑的方案:直接把构建/运行环境的Alpine版本升到3.14及以上。高版本Alpine自带的musl、libstdc++版本完全满足ERTS 12.3.2.1的依赖要求,不需要额外折腾依赖就能正常构建运行。
- 如果因为业务要求必须锁死Alpine 3.12版本:
- 手动把musl升级到1.2.x版本、gcc/libstdc++升级到11及以上版本。注意3.12官方默认源没有这两个高版本包,手动升级时要做好兼容测试,避免搞坏系统其他基础组件
- 不要用任何外部预编译的BEAM/ERTS二进制,必须在当前3.12环境下从源码完整编译整套Erlang/OTP组件,编译时强制链接系统自带的低版本标准库,不要混进高版本环境编译出来的动态/静态库。
多阶段构建场景要特别注意:构建阶段和最终运行阶段的Alpine大版本必须保持一致,高版本编译、低版本运行必然会出现这类符号找不到的重定位错误。
内容的提问来源于stack exchange,提问作者William Ross
相关产品推荐
相关产品推荐

