源**:
#include
intmain()
編譯上面的**之後進行除錯。
在初始化之前,a、pon、ppon的值各為:(可以使用info locals
命令進行檢視區域性變數)
0x0執行結束退出main之前,a、pon、ppon的值各為:
a =
0xapon =
0x7ffeefbff94c
ppon =
0x7ffeefbff940
通過上面的輸出結果,以及printf輸出的值:
pon = efbff94c,
*pon =10,
&a = efbff94c,
&pon = efbff940
ppon = efbff940,
*ppon = efbff94c,
**ppon =10,
&ppon = efbff938
通過這裡可以看出如下的關係:
對上圖的解釋:
ppon 是乙個 指向指標的指標,指標指向pon;pon是乙個指標,指向a;int **ppon = &pon;
等價於int **ppon; *pon = pon;
其他:
上圖中,可以看到 ppon和pon位址是挨著的,差了8位是因為我的是64位機器,但是:pon和a之間差了12,本來只應該差8的,但這裡多出了4位元組,在gdb中可以看到0x7ffeefbff948 存放的是 『%p』,但是怎麼來得,沒有分析出來。
在gdb中使用x/1i 0x7ffeefbff948
命令檢視,得到0x7ffeefbff948: and eax,0xa000050
的結果,見下圖,
ida中進行檢視,可以看到,在這裡加了4位元組才開始放a值。
但是,這裡為什麼加4位元組,還不知道原因。
update~
關於為什麼加4位元組,想清楚了,是因為int是4位元組,自己的是64位機器,這裡多的4位元組是因為位元組對齊的原因才新增的。
對0xa00005025
進行分析,拆分為0xa
和0x00005025
,位元組對齊是低位對齊,所以,高位padding0x00005025
,為什麼padding0x00005025
,暫時還未找到原因。其記憶體布局如下所示,為什麼是這麼布局的,涉及到大小端機,個人電腦一般都是小端位元組序:低位放低位址。
如果最開始將a設定為int a = 0x12345678;
,可以得出下面的布局情況,上面的分析得到驗證。
通過 GDB 除錯理解 GOT PLT
關於 linux 中 elf 檔案格式可參考詳細文件 elf format 本文僅記錄筆者理解got plt的過程。got global offset table 全域性偏移表用於記錄在 elf 檔案中所用到的共享庫中符號的絕對位址。在程式剛開始執行時,got 表項是空的,當符號第一次被呼叫時會動態...
Linux學習 gdb除錯(指標的指標)
昨天遇到乙個很奇怪的問題,如下 按照理論,最後 p的值應該是99,不知為什麼是15了,所以今天記錄用gdb除錯的過程,並熟悉gdb的使用。除錯過程參考 開始 1.2.用list從第1行開始列出原始碼 3.一次只列10行,如果要從第11行開始繼續列源 可以輸入list 4.也可以什麼都不輸直接敲回車,...
gdb 除錯 vs除錯
一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...