使共享库成为独立的(将共享库的依赖项递归地预先链接到其中)?

问题描述 投票:0回答:1

我想将本机共享库打包到Java应用程序中(因此它成为JAR的一部分),以便通过JNI调用。

共享库(Linux)来自第 3 方并具有一些依赖项,大致如下所示:

$ readelf -d libpdalcpp.so.17.0.0
 
Dynamic section at offset 0xd9a4a0 contains 38 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libgdal.so.32]
 0x0000000000000001 (NEEDED)             Shared library: [libproj.so.25]
 0x0000000000000001 (NEEDED)             Shared library: [libgeotiff.so.5]
 0x0000000000000001 (NEEDED)             Shared library: [libxml2.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 ...

我的问题是我不能(不想)保证这些依赖项在运行时可用;生成的 Java 应用程序将在基于某些(我不想关心哪个)Linux 发行版的 JRE 容器中运行。

所以我想要的是在构建时解决这些依赖关系,并将我的初始共享库对其他共享库的依赖关系转换为对系统中其他共享库没有任何(或尽可能少)依赖关系的共享库。

  • 这能实现吗?链接器支持这种操作吗?
  • 整个想法很愚蠢吗? (到目前为止我得到的最好答案是共享库背后的原理是模块化;然而,像 JRE(或 CLR,或...)这样的字节码机器属于共享库用于插件的类别,并且插件通常应该是独立的)
linker java-native-interface shared-libraries
1个回答
0
投票
所以我想要的是在构建时解决这些依赖关系,并将我的初始共享库与其他共享库的依赖关系转换为没有任何依赖关系的共享库

这在实践中是不可能的:几乎所有 UNIX 系统都将共享库视为
最终

链接产品,无法对其进行有意义的修改(除非以非常有限的方式进行修改)。

© www.soinside.com 2019 - 2024. All rights reserved.