2011-04-15 35 views
1

0x0000000149ab0d2c < 0000> jmpq * 0x1e04b6(%RIP)#0x149c911e8爲什麼jmpq可以跳到與Mac OS X上的GDB提示不同的地址?

(GDB)P $ RIP $ 1 =(無效(*)(無效))0x149ab0d2c

(GDB)P $ RIP + 6 + 0x1e04b6 $ 4 =(無效(*)(無效))0x149c911e8

步驟1之後:(它應該是在0x149c911e8然後,然而...)

(GDB)p $ RIP $ 5 =( void(*)(void))0x148c46d4a

順便說一句,我的環境是Mac OS X 10.6.4。該程序加載2個dylib,這兩個dylib鏈接到使用-fPIC選項編譯的相同靜態庫。這個問題混淆了dylib,並讓其中一個在另一個調用函數,這不應該,因爲它們實際上是相互獨立的。

回答

3

*表明這是絕對跳躍,而不是相對跳躍。絕對跳轉將跳轉到存儲在寄存器中的地址,或者在這種情況下跳轉到存儲在給定位置的地址。如果您閱讀地址0x149c911e8(x/gx 0x149c911e8)的內容,您可能會發現它包含地址0x148c46d4a。

+0

您的意思是_indirect_? – ninjalj 2011-04-15 22:14:51