簡體   English   中英

使用-funwind-tables進行編譯時到底發生了什么?

[英]What exactly happens when compiling with -funwind-tables?

來自: https//gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html

-fexceptions :啟用異常處理。 生成傳播異常所需的額外代碼。 對於某些目標,這意味着GCC為所有函數生成幀展開信息,

-funwind-tables-fexceptions類似,不同之處在於它只生成任何所需的靜態數據,但不會以任何其他方式影響生成的代碼。 您通常不需要啟用此選項; 相反,需要此處理的語言處理器代表您啟用它。

有人可以從-funwind-tables解釋,“任何需要的靜態數據”是什么意思。 他們指的是什么數據。 為什么需要生成數據? 如果沒有生成數據會怎么樣? 這些數據用於哪里?

它也說“類似於-fexception ”。 所以我認為它也會生成幀展開信息。 什么是幀展開信息? 誰使用框架信息以及如何使用?

在一些SO帖子中,我讀到必須使用此標志編譯程序,因為_Unwind_Backtrace必須正常工作。 請解釋_Unwind_Backtrace如何使用-funwind-tables生成的信息。

-funwind-tables選項提到的靜態數據是幀展開信息,即允許正在運行的程序從給定執行點返回函數調用堆棧的數據。 向后移動函數調用堆棧意味着從被調用函數的執行上下文移動到調用者的上下文,即從函數返回時通常會發生的情況,除了框架展開信息允許您從內部的任意點執行此操作。功能的身體; 你也沒有被迫實際退出被調用函數,你可以簡單地“窺視”調用者上下文內部(例如,檢索調用被調用函數的位置),也可以遞歸,但是繼續執行正常的執行流程。叫功能。

為了能夠執行上述操作,您需要訪問有關編譯代碼的更多信息,而不是程序遵循“正常”執行流程所需的信息。 此信息(即幀展開信息)由鏈接器放置在專門用於此目的的特殊鏈接器部分(例如x86平台的.eh_frame部分,或ARM平台的ARM.exidx和.ARM.extab部分)中。 這些鏈接器部分與C ++等語言中實現異常處理所需的相同,其中執行流可能會因拋出異常而從被調用函數跳轉到其調用者。 如果通過使用-fno-unwind-tables選項禁用此數據的生成,則無法返回函數調用堆棧或使用C ++異常。

值得注意的是, libunwind使用幀展開信息, libunwind是一個跨平台庫,支持生成回溯,跳轉到調用堆棧中的任意點等等。

_Unwind_Backtrace()是在GCC核心庫中實現的函數(更具體地說,在libgcc_s中),它允許為調用堆棧中的每個幀執行回調函數(作為參數提供),即從調用函數的上下文開始,移動到它的來電,等等。 請參閱https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/baselib--unwind-backtrace.html 同樣,這個能夠完成其工作的函數需要從相應的鏈接器部分訪問幀展開信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM