pretty code

2018年12月14日 星期五

UEFI Application - Stack overflow

最近在幫同事看一個問題
覺得很有趣,故記錄一下解題思路

同事在 build code 時,發現一個 link error
正在產生程式碼
已完成程式碼產生
UefiApplicationEntryPoint.lib(ApplicationEntryPoint.obj) : 
error LNK2001: 無法解析的外部符號 __chkstk

網路查了一下,是因為 VC compiler 檢查到某些 function  有 stack 問題時
便會在 code 中插入 __chkstk 這個 check function

網路看到的解法都是放大 stack size
可以在 INF 檔案編譯選項中加入 /GsXXXXX
但據實測的結果是一點用處都沒有
stack size 還是維持在 32K 左右

後來試著在 INF 檔案編譯選項中加入 /FAcs 選項
此選項會產生 assembly 檔案
副檔名為 .cod

接著在 UDK\Build\程式路徑中
用 grep 搜尋 __chkstk 關鍵字
便可以看到是那個 function 被插入了 __chkstk

底下是我模擬的結果
很明顯的看到 rsp register 被保留了 32776 這麼大的空間(char LocalVar[32768])
當然會造成 stack overflow



沒有留言: