在手动加载的库上使用预链接? (如 Java 本机库)

在手动加载的库上使用预链接? (如 Java 本机库)

据我所知,预链接只能与可执行文件在编译时声明需要的动态库一起使用(可以使用以下命令找到的库)LDD)。它似乎不包括由可执行文件手动加载的动态库,例如插件或(在我的特定情况下)Java 本机库。有没有办法强制预链接覆盖这些类型的库?

答案1

当您prelink在 ELF 二进制文件上运行时,它只会检查二进制文件本身及其依赖项(如 ELF.dynamic.dynstr部分中所引用)。

您应该能够使用:

prelink --libs-only libone.so libtwo.so [...]

如果一个库依赖于另一个库,您可能需要在同一命令行上一起指定它们(即,如果它们不在正常的链接器路径中)。

然而,预链接的一个重要部分是能够确定最佳加载位置每一个对于进程的库,您可能无法通过单独执行库来获得预链接的全部好处。只要满足以下两个条件,这种情况就不会发生:

  • 您使用共享缓存 ( /etc/prelink.cache) 以便所有库都获得唯一的基础
  • -m预链接时不使用(节省内存)

确认操作成功

prelink --print-cache

相关内容