1. 程式人生 > >對於進程地址空間中棧大小的檢驗

對於進程地址空間中棧大小的檢驗

nbsp 編譯 獲得 調試 main函數 ima spa 令行 obj

為了檢驗地址空間中進程棧的大小,我們首先使用命令行查看了解進程棧的大小

技術分享圖片

得知棧的大小是8192kb,也就是8M.

那麽實際情況也是如此嗎?

為了驗證我們使用無限遞歸的方式使得棧溢出,從而獲得棧的大小。

 1 void* ptr;
 2 
 3 void blow_stack() {
 4     blow_stack();
 5 } 
 6 int main() {
 7     asm(" mov %%rsp, %0\n": "=r"(ptr));
 8    
 9     blow_stack();
10     return 0;
11 }

編譯完後使用

objdump -S ./a.out 

查看匯編源碼中的main函數

技術分享圖片

我們發現main函數首先講寄存器棧基址寄存器rbp壓棧,然後講rbp賦值為棧頂寄存器rsp,如果我們知道棧溢出的位置減去調用main函數時棧的位置也就是調用main函數的rsp(棧從高位向低位增長,main函數首先壓棧rbp),就大概知道棧的大小,

使用gdb調試

gdb ./a.out

技術分享圖片

約等於8196kb(8M),與系統所給的參數基本相符。

對於進程地址空間中棧大小的檢驗