2013-05-08 104 views
3

我正在尋找與Apple的otool反彙編一些x86_64代碼。這裏的拆卸的樣本,通過otool作爲輸出:爲什麼64位地址的前4個字節打印爲0x00000001?

0000000100055de4 movq $0x00000000,%rax 

只有最後4個字節在該偏移量,00055de4,代表該指令的文件地址。我可以打開一個十六進制編輯器並導航到0x55de4movq指令在那裏。

但是,我注意到gdb只適用於當我在地址中包含所有8個字節時,包括神祕的1break *0x0000000100055de4按預期工作,而break *0x00055de4從不觸發。

我用otool分析過的每個64位二進制顯示了這種模式。它顯然不適用於32位地址。

那麼,如果0x55de4是實際地址,爲什麼otoolgdb使用0x0000000100055de4

回答

1

__PAGEZERO,64位Mach-O二進制文件中的第一個加載命令,在虛擬內存中指定0x100000000的段大小。

$ otool -Lv 二進制

command 0 
     cmd LC_SEGMENT_64 
    cmdsize 72 
    segname __PAGEZERO 
    vmaddr 0x0000000000000000 
    vmsize 0x0000000100000000 

當你做break *0x00055de4斷點在這一領域零的,這可以解釋爲什麼它從來沒有擊中結束。 0x0000000100055de4是加載到虛擬內存中時該指令的地址(可在二進制文件中的0x55de4處找到)。

對於32位二進制文​​件,__PAGEZERO大小爲0x1000,這解釋了爲什麼該模式不適用。

相關問題