2013-04-09 57 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

相關問題