2016-03-20 43 views
2

在C \ C++程序的主函數的堆棧框架中,是否有保存的返回地址和保存的堆棧指針(ebp)?如果是這樣,他們指向哪裏,因爲沒有先前的堆棧幀要記錄?main的堆棧幀是否有保存的幀指針和保存的返回地址?

+2

這些都不是C或C++語言規範的一部分。這些是實現細節,任何實現都可以按照它認爲合適的方式處理。就操作系統而言,「main」通常不是入口點。真正的入口點通常是語言支持實現的一部分(例如CRT)。 – IInspectable

+1

一般來說是的,但作爲@IInspectable已經指出,這是一個實現的細節,並不是由C和C++標準保證。 –

+1

對於C++,該語言要求某些代碼可以在'main'之前執行,這意味着userland中的某些內容負責調用它們。 – o11c

回答

2

由gcc,MSVC和其他編譯器創建的C \ C++二進制文件也有一個入口點_start,它是庫的一部分,並被靜態鏈接到可執行文件中。操作系統的ELF/PE加載程序爲程序運行設置堆棧,並在安排後,CPU 返回_start,然後執行某些庫特定設置並調用main。因此,在調用main時,存在一個存儲的返回地址,該地址返回到clib函數,然後使用系統調用通知OS終止程序。

但是,正如評論指出的那樣,這不是由語言標準本身定義的,而是它在現有系統中最常用的方式。

+1

在MSVC的CRT實現中沒有叫'_start'的符號。 Unicode控制檯應用程序的入口點稱爲'wmainCRTStartup'。 – IInspectable