我正在重写ASM中的一些C函数来练习。
我的memset
函数将RAX
设置为RDI
寄存器中传递的相同地址。
但是gcc正在使用AL
指令扩展CDQE
的值。
char super[] = "suuuuuuuuuuper";
res = memset(super, 't', 4);
printf("memset = {%s} (%p) res = %p\n", super, super, res);
输出:
memset = {ttttuuuuuuuper} (0x7fffffd30250) res = 0xffffffffffd30250
如果我尝试访问res
中存储的地址,则会发生分段错误。
我只需编辑二进制文件并将CQDE
调用替换为两个NOP
指令,它就会完美运行。
但是我想知道是否还有别的东西,例如GCC旗帜以避免这个电话?
答案 0 :(得分:3)
确保调用memset()
的代码看到了memset()
的正确原型,因此它知道该函数返回void*
而不是int
。
当然,您还需要将-fno-builtin-memset
选项传递给编译器(或类似的东西),以确保编译器完全调用您的函数。