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

0xR*_*0xR 2 java java-native-interface 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时它确实有效.

先感谢您!

0xR*_*0xR 6

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

有趣的是,我没有自己编写该共享库,我希望默认编译添加标志,因为软件需要它才能正常运行.

无论哪种方式,它都是一个开源项目,所以我可以使用适当的标志集编译它.