已开启
现有的perl.hnp无法加载任何第三方 XS 模块 #9
Moximxxx创建于  24 天前
Moximxxx
24 天前 创建

环境

  • 设备:HarmonyOS PC(aarch64)
  • 运行时:应用市场 DevBox 携带的 perl.org/perl_5.42.0.hnp

使用场景

我们的应用以该 perl 为解释器运行 biber(CPAN 上的文献处理工具,纯 Perl 应用)。biber 依赖约 25 个 CPAN 模块,我们在应用内补齐:

  • 纯 Perl 模块 19 个:Log::Log4perl、DateTime 系列、Data::Compare、Data::Dump、Data::Uniqid、File::Slurper、IPC::Run、List::AllUtils、Parse::RecDescent、Regexp::Common、Text::CSV、Text::Roman、URI、XML::Writer、MIME::Charset、Class::Accessor 等 —— 这些工作正常
  • XS 编译模块 6 个:Clone、Text::BibTeX(含 btparse)、Sort::Key、XML::LibXML(含静态 libxml2)、Unicode::LineBreak(含 sombok)—— 用 OHOS SDK clang 15 按 perl 5.42.0 官方头文件交叉编译,全部无法加载

报错

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 变量)。它们在该二进制中完全不存在(连字符串都没有),推测构建时存在以下情况之一:

  1. 使用了 -Uusemultiplicity 或非常规 Configure 参数组合,导致这些符号未被编译/导出;
  2. 或使用了激进的符号可见性裁剪(如 -fvisibility=hidden 且未保留 API 导出);
  3. 或实际构建源码与发布的 5.42.0 版本号不一致(如预发布快照)。

无论哪种情况,结果是:任何按 perl 5.42.0 官方头文件标准流程编译的第三方 XS 模块都无法在该运行时上加载,CPAN 生态中含 XS 依赖的模块对该运行时实质不可用。

likedislike