2009-12-07 78 views
5

我有一個gcc編譯的應用程序鏈接到動態庫。有沒有辦法強制加載庫的順序? (在我的情況下,一個庫構造函數使用由其他庫構造函數設置的資源)。施加圖書館加載訂單

謝謝。

回答

5

gcc不負責加載庫,或者ld.so在您的程序加載時自動執行,或者您按照@jldupont的建議手動執行。

ld.so可能故意randomise爲了防止返回stdlib攻擊。

因此,要麼:

  1. 裝入庫自己。
  2. 或者刪除庫加載腳本之間的依賴關係。
  3. 使庫本身包含依賴關係(可能工作,可能不會) 這就是當你到達鏈接每個共享庫的點時,確保它包含鏈接命令中的-l<dependentlib>。您可以通過創建一個只與該共享庫鏈接的trival程序來進行測試 - 如果構建並運行,則庫包含所有必需的相關庫。這可能會有所幫助,如果ld.so加載庫的依賴順序 - 我認爲它必須做。
+0

如何「讓庫本身包含依賴項」? – jackhab 2009-12-07 13:19:22

+0

@Jack - 編輯我的答案 - 基本上鍊接庫時,確保所有相關的庫鏈接。 – 2009-12-07 13:42:32

3

您可以使用dlopen並自行加載庫:這樣,您可以對加載/卸載過程進行更精細的紋理控制。見here

當然,這不是一個基於「gcc」的解決方案,它需要重新處理你的應用程序......也許你可以在更多細節中解釋你所面臨的「問題」?

如果它不符合您的需求,您可以忽略我的解決方案。乾杯!