【发布时间】:2021-01-09 02:53:18
【问题描述】:
我的系统是 Debian 64 位
我用c写了一个简单的hello world程序
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
编译它
gcc -g -o char_array2 char_array2.c
并通过gdb -q ./char_array2输入gdb
现在当我尝试像这样在 strcpy 设置断点时
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb)
尝试运行,断点未解析,打印出“Hello world”,程序终止。
按下运行后应该发生什么
Breakpoint 4, 0xb7f076f4 in strcpy () from /lib/tls/i686/cmov/libc.so.6
现在我在一本教授 32 位系统上的汇编的书中读到了这篇文章,并且路径显示 /i686/,所以我怀疑由于我使用 64 位处理器而缺少某种功能。我该如何解决这个问题?
【问题讨论】:
-
可能没有实际调用
strcpy。相反,编译器只是内联了初始化数组所需的程序集。 -
即使禁用了优化,GCC 仍然将
strcpy视为内置函数,并将该副本从文字复制到mov-immediate,因为 arg 是同一语句的常量部分. godbolt.org/z/GvP8vn。如果你想让 GCC 变笨,请使用-fno-builtin编译。 -
What exactly is -fno-builtin doing here? 与您的问题完全相同,具有相同的来源和相同的问题,包括相同的 GDB 错误消息,但它们仍在为 32 位模式编译。也许你运气不好,你使用的搜索词没有出现。
标签: c debugging assembly gcc gdb