隱形

2012-02-27 50 views
2

從通過JNI加載的共享庫中調用的dlopen使得先前加載符號具有與使用JNI本機代碼交互的Java應用程序。本機代碼在運行時編譯文件,並嘗試使用dlopen調用加載此文件。此調用失敗,我得到一個警告,指出隱形

Could not load library (x):(x) undefined symbol: y

然而,當我有開始通過JNI一個JVM上運行相同的代碼的本地應用程序,則不會出現此錯誤,它運行正常。我懷疑Java正在做的事情看中這將導致已經加載庫是裝載有的dlopen庫中不可見。

這是我沒有診斷問題:

  • 其中共享庫,假想未定義使用objdump
  • 位於確認這庫是通過使用gdb加載的符號確認(通過蝕 - 庫被列在模塊窗格中)
  • 在dlopen之前打印LD_LIBRARY_PATH並確認Java將它傳遞過來(它確實添加了Java的lib目錄,但原始目錄仍然存在)

我一直在試圖解決現在這一段時間,但我無法弄清楚到底是怎麼回事。尤其是因爲它在JVM從本機應用程序加載時工作。

預先感謝您!

+0

我從來沒有使用'從JNI dlopen'出現了問題。這是什麼操作系統?這個'y'符號在哪裏定義?你確定JVM正在加載任何包含'y'的庫嗎? – 2012-02-27 18:47:46

+0

是的,就像我說過的,我確認了在哪個庫符號y中使用'objdump -x | grep y'並檢查JVM是否正在使用'gdb'加載它。操作系統是Ubuntu 11.10 64位。我正在運行'Java HotSpot™64位服務器虛擬機(構建20.1-b02,混合模式)'的'Java™SE運行時環境(build 1.6.0_26-b03)''。我也確認了應該加載的庫也是64位的。 – 0xR 2012-02-28 13:45:27

+0

我認爲我的問題與libtool的-export-dynamic標誌有關。不過,我試圖設置這一點,似乎並沒有解決問題。我會繼續嘗試。 – 0xR 2012-03-24 12:08:28

回答

6

我終於找到了答案。解決方案是重新編譯共享庫,其中包含使用-Wl,--export-dynamic鏈接程序標誌找不到的符號。

有趣的是我沒那個共享庫自己計劃,我期望默認的編譯添加的標誌,因爲它是使用它才能正常工作所需要的軟件。

無論哪種方式它是一個開源項目,所以我可以編譯它與正確的標誌集

+0

謝謝你回答你自己的問題。歡迎來到SO。 – Jayan 2012-03-30 07:55:11

+0

我正在通過'./configure'命令編譯'GSL'庫。我應該在哪裏放置這個鏈接器選項? – 2015-06-10 04:42:45

+0

你能解釋一下你認爲兩面旗子在做什麼嗎? – nikk 2016-06-09 04:08:27