我正在使用DWARF parser在.debug_str
部分中查找字符串数据。在我正在解析的ELF文件中,字符串数据在.strtab
部分中。这两个部分有什么区别?都包含字符串,对不对?
最佳答案
他们彼此无关。
嗯,是。而且每个部分都包含字节,因此接下来您将要问“.text
和.data
之间有什么区别?”。.debug_str
部分包含调试字符串,这是调试所需的。.strtab
部分包含(静态)链接所需的符号名称。
运行时都不需要这两个部分(实际上不需要任何部分)。
.strtab
通常存在于带有或不带有-g
和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 ?? ()
Not very useful, is it? Compare to unstripped binary:
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 ()
关于elf - 在DWARF文件中,.debug_str和.strtab有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41495151/