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

时间:2017-01-05 21:38:48

标签: elf dwarf

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

1 个答案:

答案 0 :(得分:3)

  

这两个部分有什么区别?

他们彼此没有任何关系。

  

两者都包含字符串,对吧?

嗯,是的。 每个部分都包含字节,接下来你会问“.text.data之间有什么区别?”。

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

运行时不需要任何部分(事实上没有部分)。

  

为什么.strtab存在于与-g链接的最终可执行文件中(即使它不再用于静态链接)?

  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 ()