c-链接器在与存档文件链接时删除未使用的执行路径



我有一个嵌入式C应用程序,它是使用CrossWorks for ARM工具链开发的。

这个项目的目标是一个特定的处理器,它越来越旧,很难找到,我们正在努力用一个新的处理器来修改我们的设计。因此,我的计划是将源代码分为一组针对旧处理器的低级别驱动程序代码和另一组能够在两个处理器上编译的通用代码。

我开始做一个驱动程序项目,它可以编译成drivers.a文件。目前这个文件实际上是空的。它的全部内容都是

!<arch>

我遇到的问题是,将这个文件包含在公共代码的编译中会导致编译后的大小膨胀。得到的二进制大约大33%。。。

以下是地图文件中一些部分的大小示例,列出的符号是FatFs函数。

Size without drivers.a          Size with drivers.a
f_close         76              f_close         148         
f_closedir      84              f_closedir      136         
f_findfirst     48              f_findfirst     108         
f_findnext      116             f_findnext      144         
f_getfree       368             f_getfree       636         
f_lseek         636             f_lseek         1,148       
f_mkdir         488             f_mkdir         688         
f_mount         200             f_mount         256         
f_open          1,096           f_open          1,492       
f_opendir       324             f_opendir       472         
f_read          564             f_read          1,132       
f_readdir       176             f_readdir       268         
f_stat          156             f_stat          228         
f_sync          244             f_sync          440         
f_unlink        380             f_unlink        556         
f_write         668             f_write         1,324           

很明显,由于额外的驱动程序.文件,链接器无法确定代码的某些部分是不可访问的,因为链接的驱动程序可能会调用这些例程。我想这是有道理的,但我需要一种方法来绕过它,这样我就可以将代码划分为可单独维护的代码,同时仍然像以前一样高效地进行编译。

我没有意识到链接*.a文件可能会产生这样的后果,我以前在脑海中有这样的想法,即*.a文件与一堆*.o文件没有什么不同,它们有效地组合成一个文件。显然情况并非如此。

事实证明,这与驱动程序中的粉状链接无关。a文件。。。

当我加入驱动程序时,我让项目设置编译器选项的方式发生了变化。a.实际上,我相信我实际上是在比较调试级别3和调试级别2,在这种情况下,添加的二进制大小是可以理解的。

最新更新