Strip

最近在学习ptmalloc,对于malloc中许多需要注意深入的地方,要用到gdb调试,但是gdb在调试进入到glibc so库中就"瞎"掉了
我废了挺大的力气配置gdb,让它能够源码级别调试malloc,但是对于libc.so.dbg是什么,为什么需要它却不太理解,其实这就涉及到了Strip。

strip在英文中是脱衣服,在linux中,strip也有脱衣服的含义,具体就是从特定文件中剥掉一些符号信息和调试信息。

strip是一个删除文件中符号信息和节的unix下的命令
我们看如下这个例子:

首先我们将它编译成debug版:

我们看到了程序中有许多与debug相关的区段
在使用gdb调试时,通过file命令我们能够获取到相应的debug信息,调试起来更加方便

下面利用strip将debug info的信息去除:

可见,与debug信息相关的区段都已经被去除了,但是我们还是在程序中保留下来了symtab,strtab等这样的符号信息与字符串信息
我们再生成release版本

结果基本上与去除debug信息版本的相同,都含有符号表
由此可见, strip后文件会变小,其中的符号信息会失去,但是仍然可以执行,这就节省了很多空间。
strip不仅仅可以针对可执行文件, 还能针对目标文件和动态库等。
在实际的linux开发中, 经常需要对动态库.so进行strip操作, 减少空间。 而在调试的时候, 就需要符号了,这也就是glibc.dbg。 因此, 通常的做法是: strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。
当gdb加载了libc的dbg文件读到了libc的调试信息,就能够更加方便地进行调试。OVer~~~

发表评论