1

这是在我所知道的范围内,请在此处纠正任何混淆。在这个问题中,我问为什么由libmPerl 接口提供的功能尚未向用户公开。现在我想知道它是如何完成的。

CPAN 上有一个声称可以这样做的模块,称为Math::Libm. 这很好用,但是当我使用它时,作为一个关于实现的问题,我发现不仅 libm 映射到进程中,就像 Debian 上任何正在运行的 Perl 解释器一样,

7f719246d000-7f719247c000 r--p 00000000 fe:01 86513750                   /usr/lib/x86_64-linux-gnu/libm-2.31.so
7f719247c000-7f7192516000 r-xp 0000f000 fe:01 86513750                   /usr/lib/x86_64-linux-gnu/libm-2.31.so
7f7192516000-7f71925af000 r--p 000a9000 fe:01 86513750                   /usr/lib/x86_64-linux-gnu/libm-2.31.so
7f71925af000-7f71925b0000 r--p 00141000 fe:01 86513750                   /usr/lib/x86_64-linux-gnu/libm-2.31.so
7f71925b0000-7f71925b1000 rw-p 00142000 fe:01 86513750                   /usr/lib/x86_64-linux-gnu/libm-2.31.so

Math::Libm也映射到另一个 libm 共享对象中,

7fb649043000-7fb649044000 r--p 00000000 fe:01 11143927                   /home/ecarroll/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Math/Libm/Libm.so
7fb649044000-7fb649049000 r-xp 00001000 fe:01 11143927                   /home/ecarroll/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Math/Libm/Libm.so
7fb649049000-7fb64904a000 r--p 00006000 fe:01 11143927                   /home/ecarroll/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Math/Libm/Libm.so
7fb64904a000-7fb64904b000 r--p 00006000 fe:01 11143927                   /home/ecarroll/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Math/Libm/Libm.so
7fb64904b000-7fb64904c000 rw-p 00007000 fe:01 11143927                   /home/ecarroll/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Math/Libm/Libm.so

这似乎是因为Autoloader加载了外部共享对象。

是否可以在不加载外部共享对象的情况下访问驻留进程中已经存在的符号?

4

1 回答 1

1

是否可以在不加载外部共享对象的情况下访问驻留进程中已经存在的符号?

您需要†</sup> 加载 XSLibm.so以从 Perl 访问 C 库函数,但是当Libm.so在运行时使用dlopen()(参见dl_load_file())加载时,动态加载器将识别出Libm.so需要libm.so但因为libm.so已经被动态链接器加载(当运行 perl 本身时),它不会被重新加载,但会返回一个现有的文件句柄,请参阅Q&A,因此共享库libm.so不会被加载两次。

脚注

† : 但另请参阅C::DynaLibFFI::Platypus以获得不需要 XS 的替代方案

于 2021-05-22T03:53:54.967 回答