为什么最终编译出来的目标文件的大小会差很多?
1. 使用strip命令可以将debug symbol从目标文件(.o/.so/.ko或者是可执行文件)中去除掉。
使用同一份源文件,编译两份目标文件出来:
一份是使用strip去除debug符号的目标文件stripped.so;
一份是未去除debug符号的目标文件non_stripped.so。
使用size命令查看这两个共享库中text section/data section以及bss section的大小几乎是一样的。
但是:
stripped.so大小大约是text section + data section + bss section几个section大小之和;
而non_stripped.so却与stripped.so的大小相差很大。
2. 使用file命令来分析这两个目标文件,其差别仅在于:
对于stripped.so,file命令的结果有stripped这样的信息;
对于non_stripped.so,file命令的结果则会显示not stripped的信息。
所以两者的差别仅在于目标文件中是否保留有符号信息。
而这符号的作用是什么,就是为了debug的方便。
3. 正因为是否有strip会造成生成的目标文件的大小增大很多,
所以最终release出来的软件一定要使用strip命令将这些symbol都去除掉,
这样才会减小对ROM/RAM的要求。
4. 如果目标文件中有符号,那么就可以使用nm命令来列出目标文件中的符号信息。
这个信息对于debug会很有用,因为它列出了符号在该目标文件中的相对位置。
结合cat /proc/<pid>/maps得出目标文件在进程虚拟地址空间中的绝对位置,
这样就能算出PC位于某个共享库中的位置。
有时候结合着objdump等工具的使用,能够帮助我们快速的找到程序crash的原因。