2013-04-09 170 views
3

标题给出了短版;其中最重要的是我有一个C++ API封装到通过XS暴露给Perl的C &。这已经运行良好多年了,但我们现在遇到了一个用例,我们怀疑这可能是由共同库的重复加载引起的。具有本地库的Perl模块:可以让XSLoader在dlopen上使用RTLD_GLOBAL?

症状是我们在Tibrv周围有一个内部Perl包装。而且,我们还有一个内部使用Tibrv的另一个C++ API的封装。当Perl脚本使用这两个API时,第二个挂起创建Tib传输。个别地,这两个工作都来自Perl。

我怀疑,但没有什么可以支持它,它以某种方式与共享状态和Perl有关,默认情况下加载库设置为RTLD_LOCAL,可能会导致此问题(这是纯粹的预感)。我没有什么可以支持的,但我知道Tib很清楚周围环境,我认为这可能是一种可能性。

我的问题: 是否有可能使用dlopen标志,如RTLD_GLOBAL Perl的XSLoader?即在不重建Perl/XS的情况下打开本机库时,是否可以更改dlopen标志?

到目前为止,我在网上看到的所有东西似乎表明您需要使用DynaLoader,它需要我们以适合DynaLoader使用的方式重建我们的lib(因为我们导出C++符号的方式) (目前不是)。

我只有约10%可以肯定,这甚至会解决实际问题,但知道,如果我们可以很容易地覆盖dlopen标志将允许我们可能省下几天功夫

回答

1

XSLoader只是DynaLoader的前端。

听起来像是你可以添加

sub dl_load_flags { 0x01 } 

你的模块。调用此方法并传递给dl_load_fileflags,它的作用:

if (flags & 0x01) 
#ifdef RTLD_GLOBAL 
     mode |= RTLD_GLOBAL; 
#else 
     Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename); 
#endif 
    DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags)); 
    handle = dlopen(filename, mode) ; 

注意dl_load_file被称为加载.so.xs编译。据我所知,XSLoader/DynaLoader不会为对象可能使用的库调用dlopen,比如您遇到问题的库。

+0

谢谢,我已经把这件事传给了我的perl家伙,他们遇到了问题。将接受我何时可以验证。 – 2013-04-09 16:28:21

相关问题