在C \ C++程序的主函數的堆棧框架中,是否有保存的返回地址和保存的堆棧指針(ebp)?如果是這樣,他們指向哪裏,因爲沒有先前的堆棧幀要記錄?main的堆棧幀是否有保存的幀指針和保存的返回地址?
2
A
回答
2
由gcc,MSVC和其他編譯器創建的C \ C++二進制文件也有一個入口點_start
,它是庫的一部分,並被靜態鏈接到可執行文件中。操作系統的ELF/PE加載程序爲程序運行設置堆棧,並在安排後,CPU 返回至_start
,然後執行某些庫特定設置並調用main
。因此,在調用main
時,存在一個存儲的返回地址,該地址返回到clib函數,然後使用系統調用通知OS終止程序。
但是,正如評論指出的那樣,這不是由語言標準本身定義的,而是它在現有系統中最常用的方式。
+1
在MSVC的CRT實現中沒有叫'_start'的符號。 Unicode控制檯應用程序的入口點稱爲'wmainCRTStartup'。 – IInspectable
相關問題
- 1. 幀指針+返回地址
- 2. 堆棧幀和堆棧指針
- 3. 幀指針,EPB,並返回地址
- 4. JMP做什麼堆棧和幀指針?
- 5. 是否將主方法的返回值保存在堆棧中?
- 6. 堆棧幀內存分配
- 7. 如何釋放指向保存地址的指針的指針
- 8. 如何保存或識別呼叫者的堆棧幀?
- 9. 保存堆棧?
- 10. 從緩衝區指針計算堆棧中的返回地址
- 11. 爲什麼在轉到下一個堆棧幀時存儲舊幀指針
- 12. 如果EBP幀指針爲NULL,堆棧是否損壞?
- 13. 返回指令堆棧中的指針
- 14. 在堆棧幀中推回返回值
- 15. 本地變量地址可以保存在返回指針的函數中
- 16. 從TangoService_connectOnFrameAvailable保存幀
- 17. 保存多幀TIFF
- 18. 在x86上沒有幀指針的堆棧展開
- 19. char * name =「Duncan」;如果指針只能保存地址,該指令是否有效?
- 20. GDB核心轉儲有損壞的堆棧,顯示「堆棧幀無法訪問地址0x12處的內存」
- 21. 指向保存地址的變量的指針
- 22. 如何保存存儲在指針中的實際地址
- 23. 有關基址指針和堆棧指針的問題
- 24. 將本地指針變量的地址返回給main()函數
- 25. MIPS堆棧幀(和「addiu」指令混淆)
- 26. 堆棧上的C++存儲保存在堆棧上
- 27. 返回到堆棧上的地址
- 28. 修改堆棧上的返回地址
- 29. C++指針和堆棧內存管理
- 30. 內存分配(指針和堆棧)
這些都不是C或C++語言規範的一部分。這些是實現細節,任何實現都可以按照它認爲合適的方式處理。就操作系統而言,「main」通常不是入口點。真正的入口點通常是語言支持實現的一部分(例如CRT)。 – IInspectable
一般來說是的,但作爲@IInspectable已經指出,這是一個實現的細節,並不是由C和C++標準保證。 –
對於C++,該語言要求某些代碼可以在'main'之前執行,這意味着userland中的某些內容負責調用它們。 – o11c