2013-03-31 19 views
0

我正在重寫ASM中的一些C函數來練習。 我的memset函數將RAX設置爲與RDI寄存器中傳遞的地址相同。 但gcc用CDQE指令擴展了AL的值。函數調用後gcc打破rax值

char super[] = "suuuuuuuuuuper"; 

res = memset(super, 't', 4); 
printf("memset = {%s} (%p) res = %p\n", super, super, res); 

輸出:

memset = {ttttuuuuuuuper} (0x7fffffd30250) res = 0xffffffffffd30250 

,如果我嘗試訪問存儲在res的地址,然後會出現分段錯誤。 我可以編輯二進制文件,並用兩條NOP指令替換CQDE調用,它將完美運行。

但我想知道是否還有其他的東西,比如GCC標誌來避免這種調用?

回答

3

確保代碼中調用memset()已經看到了正確的原型memset()所以它知道該函數返回一個void*,而不是一個int

當然,您還需要將-fno-builtin-memset選項傳遞給編譯器(或類似的東西)以確保編譯器調用您的函數。

+0

非常感謝,我正準備嘗試! –