什么是符号表以及它如何集成到可执行文件中?

use*_*729 16 gdb symbol-tables executable-format

当我尝试调试可执行文件时:

(gdb) break +1
No symbol table is loaded.  Use the "file" command.
Run Code Online (Sandbox Code Playgroud)

这究竟是什么意思?

符号表是否附加到可执行文件?

nat*_*ose 22

gdb使用两组符号.

-g set是调试符号,它使事情变得更容易,因为它们允许您在调试时查看代码并查看变量.

编译时默认包含另一组符号.这些是链接符号,并且存在于ELF(可执行链接格式)符号表中.这包含的信息少于调试符号,但包含最重要的内容,例如可执行文件(或库或目标文件)中的内容的地址.没有这些信息,gdb甚至不知道main在哪里,所以(gdb) break main会失败.

如果您没有调试符号(-g),那么您仍然可以,(gdb) break main但是gdb将不会在源文件中包含任何代码行的概念.当您尝试单步执行代码时,您一次只能提前1台机器指令,而不是一次一行.

strip命令通常用于strip从可执行文件(或其他目标文件)中删除符号.如果您不希望某人能够看到符号或者您希望节省文件空间,则通常会使用此选项.符号表可以变大.Strip删除调试符号和链接器符号,但它有几个命令行开关,可以限制它删除的内容.

如果你file在你的程序上运行命令,它将告诉你的一件事是天气,可执行文件已被删除.

$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
Run Code Online (Sandbox Code Playgroud)

  • `strip`有一些选项可以控制哪些符号被删除.默认行为通常不会破坏事物. (2认同)
  • @ManuelSelva ELF 格式是与 DWARF 调试符号格式一起生成的,与许多旧的目标文件格式不同,它内置了对调试符号的支持。较旧的目标文件格式的调试符号设施因滥用该格式的其他设施而受到攻击。`-g` 标志对许多编译器来说意味着“请调试符号”,但是他们可以不加它来添加符号,或者不使用它来生成符号。这些符号具有诸如“代码地址=>(函数:行号)”以及“在此代码地址处,X 的最新值在此寄存器中”之类的信息。 (2认同)

rku*_*lla 8

这是因为你没有打开调试编译.试试gcc -g file.c

  • @ user198729:您可以使用GDB来调试任意程序,但如果程序没有符号表,您必须更加努力.基本上,符号表告诉调试器有关函数和变量以及行号和源文件 - 如果它丢失了,你剩下的只是汇编程序. (2认同)