Alpine 3.3容器运行jpenable触发JProfiler10 UnsatisfiedLinkError
解决Alpine 3.3 + JDK8下JProfiler10 jpenable的UnsatisfiedLinkError问题
这个错误的核心原因很明确:Alpine Linux默认使用musl libc,而JProfiler10预编译的native库(比如libattach.so)是针对glibc编译的,__strcpy_chk是glibc特有的安全字符串函数,musl libc中没有这个符号,所以加载库时触发了链接错误。
下面是两种可行的解决思路,按推荐优先级排序:
1. 安装glibc兼容层(最直接的方案)
Alpine社区有第三方维护的glibc兼容包,可以在不替换系统libc的前提下为依赖glibc的程序提供支持:
首先在容器中安装适配Alpine 3.3的glibc包:
# 添加glibc的验证密钥 wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub # 下载适配Alpine 3.3的glibc版本包 wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-2.23-r3.apk # 安装兼容包 apk add --no-cache glibc-2.23-r3.apk然后设置环境变量,让JProfiler的native库优先调用glibc的链接库:
export LD_LIBRARY_PATH=/usr/glibc-compat/lib:$LD_LIBRARY_PATH最后再执行
jpenable,应该就能正常加载性能分析agent了。
2. 升级Alpine版本(如果业务允许)
Alpine 3.3是非常老旧的版本(发布于2016年),后续的Alpine版本对glibc兼容做了不少优化,同时musl libc本身也补充了更多glibc兼容符号。如果你的业务容器可以升级到Alpine 3.10及以上版本,有可能不需要额外安装glibc就能运行JProfiler10的native组件。
不过升级前请务必确认你的应用和依赖在新版本Alpine上能正常运行。
补充说明:JProfiler后续版本(比如JProfiler 12+)开始提供针对musl libc的专门构建版本,如果有条件升级JProfiler版本,也可以直接使用适配musl的版本,从根源上解决libc兼容问题。
内容的提问来源于stack exchange,提问作者Bjorn Loftis
相关产品推荐
相关产品推荐

