标题给出了短版;其中最重要的是我有一个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
标志将允许我们可能省下几天功夫。
谢谢,我已经把这件事传给了我的perl家伙,他们遇到了问题。将接受我何时可以验证。 – 2013-04-09 16:28:21