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

我們知道:
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中的所有標紅部分。
發佈了28 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章