同样的source code,为什么strip symbol跟not strip symbol编译出来的目标文件的大小会差很大?

本文探讨了在编译过程中使用strip命令去除debug符号的影响,解释了为何去除后目标文件大小显著减小,并阐述了符号信息对debug的重要性。通过比较去除debug符号前后的目标文件大小差异,说明了在最终发布软件时使用strip命令的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上一篇的学习,
http://blog.csdn.net/boyxulin1986/article/details/21788873

为什么最终编译出来的目标文件的大小会差很多?

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的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值