从通过JNI加载的共享库调用dlopen会使以前加载的符号不可见



我有一个Java应用程序,它使用JNI与本机代码交互。本机代码在运行时编译一个文件,并尝试使用dlopen调用加载此文件。此呼叫失败,我收到一条警告,说明

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

然而,当我让一个本机应用程序通过JNI启动JVM时,运行相同的代码,这个错误不会发生,它会按预期运行。我怀疑Java做了一些奇特的事情,导致已经加载的库对于使用dlopen加载的库是不可见的。

我这样做是为了诊断问题:

  • 使用objdump确认本应未定义的符号位于哪个共享库中
  • 已确认使用gdb加载了该库(通过eclipse-该库已在模块窗格中列出)
  • 在dlopen之前打印LD_LIBRARY_PATH,并确认Java通过它(它确实添加了Java的lib目录,但原始目录仍然存在)

我已经尝试解决这个问题有一段时间了,但我不知道发生了什么。特别是因为当JVM从本机应用程序加载时,它确实有效。

提前谢谢!

我终于找到了答案。解决方案是重新编译包含-Wl,--export-dynamic链接器标志未找到的符号的共享库。

有趣的是,我自己并没有对共享库进行编程,我希望默认编译添加标志,因为使用它的软件需要它才能正常工作。

不管怎样,它都是一个开源项目,所以我可以使用适当的标志集编译它。

最新更新