Linux
在手動載入的庫上使用預連結?(如 Java 原生庫)
據我所知,預連結只能與執行檔在編譯時聲明它需要的動態庫一起使用(可以使用ldd找到的庫)。它似乎不包括由執行檔手動載入的動態庫,例如外掛或(在我的特定情況下)Java 本機庫。有沒有辦法強制預連結覆蓋這類庫?
當您
prelink
在 ELF 二進製文件上執行時,它只會檢查二進製文件本身及其依賴項(如 ELF.dynamic
和.dynstr
部分中所引用的)。您應該能夠使用:
prelink --libs-only libone.so libtwo.so [...]
如果一個庫依賴於另一個庫,您可能需要在同一命令行上同時指定它們(即,如果它們不在正常的連結器路徑中)。
但是,預連結的一個重要部分是能夠確定為程序載入每個庫的最佳位置,通過單獨執行庫,您可能無法獲得預連結的全部好處。只要這兩個都是真的,就不會發生這種情況:
- 您使用共享記憶體 (
/etc/prelink.cache
) 以便所有庫都有一個唯一的基礎- 預連結時不使用
-m
(節省記憶體)確認操作成功
prelink --print-cache