程序裝載時各動態庫的 init段的執行順序

2021-08-18 13:06:21 字數 557 閱讀 2525

我們知道:

1,每個動態庫都有.init段,.init段的**會在main函式之前執行。我們可以自定義.init函式,例如,

__attribute__ ((constructor))

static void __my_init_func(void)

2,啟動程序時,ld_preload指定的動態庫,會被優先載入(位於程序位址空間的頂端處)。

那麼,ld_preload的動態庫,其.init段會被優先執行嗎?

答案是否定的!

那麼.init函式的執行時機和順序到底是什麼?通過分析uclibc的libdl原始碼看,

每個動態庫的建構函式(.init段),並不是在載入完該動態庫就立刻執行的,而是libdl在裝載動態庫過程中,會把每個init段依次填入乙個陣列(假設為init_array),當所有依賴庫都裝載完之後,先根據動態庫之間的依賴關係,來對init_array進行重新排序,排完序之後再依次執行。因此,優先載入的動態庫,其init段並不一定優先執行!

pc測試驗證(因為pc的libdl支援debug模式)後印證了我們的理論分析。注意下面log中的所有標紅部分。

動態庫的裝載

檢視動態連線庫的相關命令 動態庫的常見問題 elf可執行檔案中動態段dt rpath指定 gcc加入鏈結引數 wl,rpath 指定動態庫搜尋路徑 環境變數ld library path指定路徑 多用於臨時指定 library path和ld library path是linux下的兩個環境變數,二...

鏈結 裝載與庫 程序的堆

本次只是簡要的總結堆的基本情況,具體的函式分析和堆演算法分析今後會繼續再學習。程式在任意時刻都可能會發出請求,申請或釋放一段記憶體資源,堆由此而生。堆 heap linux程序堆管理linux下的程序堆管理提供了兩種堆空間分配方式 系統呼叫 void mmap void start,size t l...

linux下編譯 鏈結 裝載 動態庫和靜態庫的學習

linux下編譯 鏈結和裝載.自己在linux上編譯 鏈結 動態庫和靜態庫的學習筆記 編譯生成可執行檔案 我們在單獨編譯的時候,只需要檢查標頭檔案,因為都放到了乙個目錄,所以單獨編譯的時候,不需要依賴其他檔案,就可以生成目標檔案 o 如下 g c showcoor.cpp g c showpoint...