这两个部分有什么区别?
他们之间没有任何关系。
都包含字符串,对不对?
嗯,是。而且每个部分都包含字节,因此接下来您将要问“ .text和之间的区别是.data什么?”。
本.debug_str节包含调试字符串,这是调试所需的。本.strtab节包含(静态)链接所需的符号名称。
运行时都不需要这两个部分(实际上不需要任何部分)。
为什么.strtab出现在与-g链接的最终可执行文件中(即使它不再用于静态链接)?
.strtab在建或最终的可执行程序通常存在不 -g和int foo(){abort(); }
int bar(){return foo(); }
int main(){return bar(); }
gcc tc
剥离-o剥离
gdb -q ./a.stripped
(gdb)运行
启动程序:/tmp/a.stripped
程序收到信号SIGABRT,异常终止。
__GI_raise中的0x00007ffff7a4bc37(sig = sig @ entry = 6),位于../nptl/sysdeps/unix/sysv/linux/raise.c:56
56 ../nptl/sysdeps/unix/sysv/linux/raise.c:无此类文件或目录。
(gdb)bt
#.0 / nptl / sysdeps / unix / sysv / linux / raise中的__GI_raise(sig = sig @ entry = 6)中的#0 0x00007ffff7a4bc37:c:56
__GI_abort()中的#1 0x00007ffff7a4f028在中止.c:89
#2 0x0000000000400536 in ?? ()
#3 0x0000000000400544 in ?? ()
#4 0x0000000000400554 in ?? ()
#5 0x00007ffff7a36f45在libc-start.c:287上的__libc_start_main(main = 0x400546,argc = 1,argv = 0x7fffffffde58,init =,fini =,rtld_fini =,stack_end = 0x7fffffffde48)中
#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 ()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |