好的,回答我自己的問題。這將逐步完成,並且只針對Linux(也許Mach-O)。隨意添加更多的東西給你的個人答案,讓他們得到upvoted(你可以得到徽章,因爲它現在是CW)。
我會中途開始,並根據我的發現建立休息。本文檔是使用x86_64,gcc(GCC)4.1.2編寫的。
打開文件,初始化
在本節中,我們描述的程序被調用時會發生什麼,從內核來看,直到程序已準備好執行。
- ELF打開。
- 內核查找.text部分並將其加載到內存中。將其標記爲只讀
- 內核加載.data節
- 內核加載.bss節,並將所有內容初始化爲零。
- 內核將控制權移交給動態鏈接程序(其名稱位於ELF文件的.interp節中)。動態鏈接器解析所有共享庫調用。
- 控制轉移到應用程序
程序的執行
- 功能_start被調用,作爲ELF頭指定它作爲入口點傳遞以下信息,它
- 廣告可執行
_start在glibc的__libc_start_main(通過PLT)調用實際主功能
- 所述的argc地址
- 所述的argv地址的禮服
- 的_init例程的地址
- 的_fini例程
- 一個函數指針爲atexit對()註冊的地址
- 可用的最高堆棧地址
_init被稱爲
- 調用call_gmon_start來初始化gmon分析。與執行沒有關係。
- 電話frame_dummy,它包裝__register_frame_info(eh_frame部分地址,BSS部分地址)(FIXME:這是什麼功能做初始化一個BSS部分顯然全局變量)
- 電話__do_global_ctors_aux,其作用是調用所有全局.ctors部分中列出的構造函數。
- 主要被稱爲
- 主要目的
- _fini被調用,它在原來的呼叫__do_global_dtors_aux作爲.dtors部分指定運行所有的析構函數。
- 該程序退出。
這僅僅是我,還是這個問題的範圍太廣泛了? – mezoid 2009-07-30 02:20:21
我不認爲它太寬泛,但應該是社區wiki – 2009-07-30 02:23:13
如果我沒有得到足夠的反饋意見,我想對它進行獎勵。如果它是CW,我將無法做到。 – 2009-07-30 02:32:40