c - 如何防止 strcpy() 被优化

标签 c gcc assembly

我正在按照《黑客:剥削的艺术》一书中的示例进行操作,但我得到的结果与这本书不同。

似乎示例中的 strcpy() 函数编译为如下指令:

0x802384c5 <main+27>: call 0x80482C4 <strcpy@plt>

而当我编译同一个程序时,它删除了对库的调用并用一系列 mov 指令替换它:

0x8048475 <main+25>: mov    DWORD PTR [eax],0x6c6c6548
0x804847b <main+31>: mov    DWORD PTR [eax+0x4],0x6f57206f
0x8048482 <main+38>: mov    DWORD PTR [eax+0x8],0x21646c72
0x8048489 <main+45>: mov    WORD PTR [eax+0xc],0xa

我知道编译器可以进行各种优化,但即使它是默认设置,我什至尝试用 -O0 编译它,这应该会阻止优化。

如何编译代码以使其引用外部库?

我从大学毕业后就没有做过任何 C 语言或汇编语言,所以对我温柔点:)

最佳答案

使用 GCC,您可以使用 -fno-builtin(禁用所有内置)或 -fno-builtin-strcpy(仅禁用内置 strcpy).

关于c - 如何防止 strcpy() 被优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13059044/

相关文章:

c - 欧拉 19 输出

c - 为什么输出被写入正在缓冲的管道

c - 增加数组中的间隔,检查

c++ - 安装WxWidgets时遇到问题

delphi - 如何从物理内存中读取数据?

c - 在基于 x86 的平台上使用 Linux 使用 C 中的结构访问硬件表

c++ - 调试器看到的输出线程 ID

c++ - 为什么模板参数推导/替换在代码中失败?-

assembly - 64 位模式不支持 32 位 PUSH 和 POP 指令

c++ - 在汇编程序中访问 std::string (c++/asm/visual studio 2015)