在 DWARF 文件中,.debug_str 和 .strtab 之间有什么区别?

In a DWARF file, what's the difference between .debug_str and .strtab?

我正在使用 DWARF parser.debug_str 部分查找字符串数据。在我解析的 ELF 文件中,字符串数据位于 .strtab 部分。这两个部分有什么区别?两者都包含字符串,对吗?

What's the difference between these two sections?

他们之间~没有任何关系。

Both contain strings, right?

嗯,是的。 每个部分都包含字节,所以接下来你会问"what's the difference between .text and .data?"。

.debug_str 部分包含调试字符串,调试需要这些字符串。 .strtab 部分包含(静态)链接所需的符号名称。

这两个部分(实际上不需要部分)在运行时都不需要。

why .strtab is present in final executable linked with -g (even though it won't be used for static linking anymore)?

  1. .strtab 通常出现在使用或 不使用 -g
  2. 构建的最终可执行文件中
  3. 它的存在是为了帮助调试。考虑:
int foo() { abort(); }
int bar() { return foo(); }
int main() { return bar(); }

gcc t.c
strip a.out -o a.stripped

gdb -q ./a.stripped
(gdb) run
Starting program: /tmp/a.stripped

Program received signal SIGABRT, Aborted.
0x00007ffff7a4bc37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff7a4bc37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff7a4f028 in __GI_abort () at abort.c:89
#2  0x0000000000400536 in ?? ()
#3  0x0000000000400544 in ?? ()
#4  0x0000000000400554 in ?? ()
#5  0x00007ffff7a36f45 in __libc_start_main (main=0x400546, argc=1, argv=0x7fffffffde58, init=, fini=, rtld_fini=, stack_end=0x7fffffffde48) at libc-start.c:287
#6  0x0000000000400469 in ?? ()

不是很有用,是吗?与未剥离的二进制文件比较:

gdb -q ./a.out
(gdb) r
Starting program: /tmp/a.out

Program received signal SIGABRT, Aborted.
0x00007ffff7a4bc37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  0x00007ffff7a4bc37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff7a4f028 in __GI_abort () at abort.c:89
#2  0x0000000000400536 in foo ()
#3  0x0000000000400544 in bar ()
#4  0x0000000000400554 in main ()