perl.org/perl_5.42.0.hnp
我们的应用以该 perl 为解释器运行 biber(CPAN 上的文献处理工具,纯 Perl 应用)。biber 依赖约 25 个 CPAN 模块,我们在应用内补齐:
Can't locate loadable object for module Clone in @INC ... Error relocating .../auto/Clone/Clone.so: Perl_croak_nocontext: symbol not found
我们将 6 个 XS .so 依赖的全部 100 个外部符号与 perl 二进制逐一比对,恰好缺失 4 个:
Perl_croak_nocontext Perl_newSVpvf_nocontext Perl_warn_nocontext __emutls_v.PL_current_context
其余 96 个(Perl_xs_handshake、Perl_newXS_flags、Perl_sv_、Perl_av_、Perl_hv_* 等)均存在。perl 解释器本体及纯 Perl 脚本运行正常。
perl 5.42.0 源码中,这 4 个符号是任何按官方头文件编译的 XS 模块都会引用的(croak/warn/newSVpvf 宏的公开入口 + 线程上下文 TLS 变量)。它们在该二进制中完全不存在(连字符串都没有),推测构建时存在以下情况之一:
croak
warn
newSVpvf
-Uusemultiplicity
-fvisibility=hidden
无论哪种情况,结果是:任何按 perl 5.42.0 官方头文件标准流程编译的第三方 XS 模块都无法在该运行时上加载,CPAN 生态中含 XS 依赖的模块对该运行时实质不可用。
环境
perl.org/perl_5.42.0.hnp使用场景
我们的应用以该 perl 为解释器运行 biber(CPAN 上的文献处理工具,纯 Perl 应用)。biber 依赖约 25 个 CPAN 模块,我们在应用内补齐:
报错
实测数据
我们将 6 个 XS .so 依赖的全部 100 个外部符号与 perl 二进制逐一比对,恰好缺失 4 个:
其余 96 个(Perl_xs_handshake、Perl_newXS_flags、Perl_sv_、Perl_av_、Perl_hv_* 等)均存在。perl 解释器本体及纯 Perl 脚本运行正常。
猜测原因
perl 5.42.0 源码中,这 4 个符号是任何按官方头文件编译的 XS 模块都会引用的(
croak/warn/newSVpvf宏的公开入口 + 线程上下文 TLS 变量)。它们在该二进制中完全不存在(连字符串都没有),推测构建时存在以下情况之一:-Uusemultiplicity或非常规 Configure 参数组合,导致这些符号未被编译/导出;-fvisibility=hidden且未保留 API 导出);无论哪种情况,结果是:任何按 perl 5.42.0 官方头文件标准流程编译的第三方 XS 模块都无法在该运行时上加载,CPAN 生态中含 XS 依赖的模块对该运行时实质不可用。