目录
- strip命令简介
- GDB调试strip后的文件
stri命令简介
GNU strip discards all symbols from object files objfile. The list of object files may include archives. At least one object file must be given.
简单来讲就是给文件脱衣服,包括可执行文件和动态库等。
可使用file命令查看文件的属性,file + 文件名,会显示出是否被strip
例如,我们写一个肥肠简单的代码main.c
1 | int add(int a, int b) |
编译生成so后,使用strip生成main_release.so,然后使用file查看两个so的状态
1 | [root@VM_0_4_centos studyCode]# gcc main.c -o main.so -shared -g -fPIC |
未strip的文件较大,strip后的文件较小
1 | [root@VM_0_4_centos studyCode]# ll |
未strip的文件使用nm可查看符号,可使用gdb调试,
strip的文件使用nm无法查看符号(加入-D参数可以继续查看),不可gdb调试,该过程不可逆。
符号表分为两部分,.systab和.dynsym部分,前者主要用于在debug和link中使用,后者主要在运行时使用,strip去掉的是.systab,所以对可执行文件和.so进行strip操作,不影响程序的执行,但是无法对so进行debug,而如果将中间文件.o进行strip操作,则无法完成编译(无法link)
nm的-D参数含义如下,即显示动态符号而不是普通符号
1 | [root@VM_0_4_centos studyCode]# nm -help |
使用nm查看两个so后的效果如图
1 | [root@VM_0_4_centos studyCode]# nm main.so |
加入-D参数,可以发现结果是相同的。
1 | studyCode]# nm -D main.so |
GDB调试strip后的文件
此时对main_release.so进行gdb是无法加载符号表的(在一开始编译时就已经加入了-g参数)
1 | [root@VM_0_4_centos studyCode]# gdb main_release.so |
既然strip的过程不可逆,那我们如何对strip后的可执行文件或库进行debug?
为了兼顾,既将符号表去掉了,出问题时又能用符号表。采用符号表和可执行程序分离的方式
制作符号表
1 | [root@VM_0_4_centos studyCode]# objcopy --only-keep-debug main.so main.dbg |
发现使用nm main.dbg和main.so查看到的符号相同,至此符号表已经创建成功
添加符号表连接
1 | [root@VM_0_4_centos studyCode]# objcopy --add-gnu-debuglink=main.dbg main_release.so |
可以看到此时gdb已经可以正常加载符号表了