出於好奇,當使用MSVCR編譯的應用程序加載時會發生什麼, Windows的加載程序如何實際初始化CRT?對於我目前收集的內容,當程序以及所有導入的庫被加載到內存中並且所有的重定位完成時,CRT啓動代碼(_CRT_INIT()
?)初始化.CRT$XC*
部分中的所有全局初始化程序,並調用用戶定義的main()
功能。我希望迄今爲止這是正確的。我們假設,爲了解釋起見,不使用MSVCR的程序(例如,用Cygwin GCC或其他編譯器構建的應用程序)試圖在運行時加載庫,需要CRT,使用自定義加載器/運行時鏈接程序,因此不涉及LoadLibrary()
。加載器/鏈接器如何處理CRT初始化?是否必須手動初始化所述部分中的所有「對象」,是否必須執行其他操作才能使庫的內部接線正常工作,還是必須調用_CRT_INIT()
(在運行時本身中定義的不切實際,據我所知,沒有出口到任何地方)。假設非CRT應用程序和CRT庫不會傳遞任何對象,例外和它們之間的事情之類,這種混淆甚至會以任何方式工作嗎?MSVCR和CRT初始化
我會找到出去很感興趣,因爲我不能完全讓出了什麼CRT對實際加載過程的影響...
的所有信息都非常感謝,謝謝!
好吧 - 所以基本上所有的CRT初始化都是「只是」_DllMainCRTStartup()在crtdll.c源文件中執行的所有操作倖運的是與VS發貨,所以每個人都可以看看它:-))?我必須說,這比我最初想象的要少得多「魔術」,但另一方面......我還期望別的什麼? ;)謝謝你的澄清! – PuerNoctis
那裏沒有魔法,我很抱歉地解僱你。 –