c - 没有加载调试符号时,gdb 如何解释 `main`?

标签 c gdb

<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/ctest/printf...(no debugging symbols found)...done.
(gdb) disas main
Dump of assembler code for function main:
0x0000000000400498 <main+0>:    push   %rbp
0x0000000000400499 <main+1>:    mov    %rsp,%rbp
0x000000000040049c <main+4>:    sub    $0x10,%rsp

当没有加载调试符号时,gdb 如何解释 main

最佳答案

GDB 不会“解释”main

如果您的问题是“GDB 如何知道 main 在哪里”,答案是:“因为它的地址在符号表中”(参见 nm/root/ctest/printf 的输出) .在 UNIX(与 Windows 不同)上,不需要调试符号在可执行文件(或共享库)中具有函数和全局变量名称——默认情况下会保留它们(以使调试更容易)。如果你想隐藏你的 main,你可以运行 strip printf 从可执行文件中删除它(和所有其他符号)。

对于你的第二个问题,main 没有被破坏,因为它有 extern "C" 链接。它必须具有该链接,以便可以从程序集调用它(它由 C 运行时启动调用,通常是 crt1.o)。

关于c - 没有加载调试符号时,gdb 如何解释 `main`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5931558/

相关文章:

c++ - 标准库实现中双下划线的原因

c++ - 在C++中使用nan初始化内存以进行调试

c - 调试多线程程序的技巧

c - Mosquitto - 无法修改 client/lib 文件夹中的代码

c - 使用 fopen() 读取文件无法正常工作

c - 如何动态创建多个未命名管道?

c - C 中结构成员的默认值是什么?

gdb - 在 GDB 中启用 ASLR

c - gdb 退出而不是生成 shell

assembly - 切换到 gdb 中的汇编