说明
- 在公司做嵌入式产品开发时,需要想办法减少系统资源占用,由于以下原因,想去掉未使用的函数。
- 嵌入式设备资源非常不足,当时只有128M内存,flash只有16M,并且公司要求资源减半,做costdown产品。
- 公司员工经验不足,编码习惯不好,以及考虑扩展,定义了很多空函数和未使用的函数。
- 链接的库,为了通用,写的比较完善,有很多接口,但是很多只使用到了部分接口。
优化尝试
库
- 静态库链接时只会将使用到的中间文件链接进程序,不会链接所有文件,因此库文件大小不重要。
- 动态库加载进内存,接口丰富的话,代码段占用内存较多,并且动态库本身需要占用存储资源,以及为了实现链接而照成额外的资源占用,并且嵌入式设备中往往只有单个或较少的几个进程。
- 总结:从上得知,在嵌入式开发中尽量使用静态库而不是动态库。
代码
- 尝试使用编译器优化选项,但是反汇编得知不管使用任何优化选项,未使用的函数都不会被清除。
可行方法
-ffunction-sections -fdata-sections //该选项让每个函数和数据独自一段
-Wl,-gc-sections //该选项将去除无用的段。
- 将C代码文件编译成中间文件时是无法确认函数是否会被使用,只有链接时才能知道函数是否被使用。
- 嵌入式系统中,对程序尺寸要求高,可以这样做,但是一但使用"-Wl,-gc-sections"之后,将无法使用gdb调试,也无法使用gprof工具了,因此只能在release版本使用。
总结
- 虽然有办法可以实现去掉未使用的函数,但是会造成无法调试的问题,代码质量最好是由程序员来把控,而不是由工具,当前的工具无法非常完美的解决代码质量问题,不然就不需要程序员了。