Linux

在手動載入的庫上使用預連結?(如 Java 原生庫)

  • October 12, 2013

據我所知,連結只能與執行檔在編譯時聲明它需要的動態庫一起使用(可以使用ldd找到的庫)。它似乎不包括由執行檔手動載入的動態庫,例如外掛或(在我的特定情況下)Java 本機庫。有沒有辦法強制預連結覆蓋這類庫?

當您prelink在 ELF 二進製文件上執行時,它只會檢查二進製文件本身及其依賴項(如 ELF.dynamic.dynstr部分中所引用的)。

您應該能夠使用:

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

如果一個庫依賴於另一個庫,您可能需要在同一命令行上同時指定它們(即,如果它們不在正常的連結器路徑中)。

但是,預連結的一個重要部分是能夠確定為程序載入每個庫的最佳位置,通過單獨執行庫,您可能無法獲得預連結的全部好處。只要這兩個都是真的,就不會發生這種情況:

  • 您使用共享記憶體 ( /etc/prelink.cache) 以便所有庫都有一個唯一的基礎
  • 預連結時不使用-m(節省記憶體)

確認操作成功

prelink --print-cache

引用自:https://unix.stackexchange.com/questions/94565