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 - 如何从下面提到的字符串格式中获取 '3 bits' 字段

c - 手动转换签名的字符

c - 我如何选择在 C 中保存进度并在下次执行程序时继续?

c - 我如何理解-O3 的优化?

beagle board 交叉编译错误。 bash 错误是什么?

c - 硬故障处理 - Arm Cortex-M0

c - 我做错了什么或者这是 Go 的 C 编译器中的错误吗?

GCC MIPS-32 调用约定/堆栈帧定义

linux - Linux 中的 AVR 汇编器

c - 在外部汇编程序中修改 C 数组