我需要严格优化可执行文件的大小(ARM开发),我注意到在我当前的构建方案(gcc+ ld)中,未使用的符号不会被剥离.
的用法arm-strip --strip-unneeded为生成的可执行文件/库不改变可执行文件的输出大小(我不知道为什么,也许它根本不能).
修改我的构建管道的方式是什么(如果存在),以便从结果文件中删除未使用的符号?
我甚至都不会想到这一点,但我当前的嵌入式环境并不是非常"强大",甚至500K可以节省2M非常好的加载性能.
更新:
不幸的是,gcc我使用的当前版本没有-dead-strip选项,并且-ffunction-sections... + --gc-sectionsfor ld不会对结果输出产生任何显着差异.
我很震惊,这甚至成了问题,因为我确信gcc + ld应该自动删除未使用的符号(为什么他们甚至要保留它们?).
我正在使用为arm-eabi编译的GCC/G ++开发嵌入式应用程序.由于资源限制,我试图禁用标准C++异常处理.我正在使用"-fno-exceptions -nostartfiles -ffreestanding"编译代码.
当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,则链接了许多异常处理代码.这不会那么糟糕,除了它还带来了很多stdio的东西,比如printf,fopen,fclose和其他FILE函数.此应用程序没有文件系统,即使这样做,这些功能也会浪费太多代码空间.
我理解即使使用-fno-exceptions,G ++链接在使用异常的operator new中,因为库没有非异常使用的operator new(new(nothrow)除外).我为operator new和delete创建了替换,它们被链接到输出以及不需要的标准库函数.
令我困惑的是,我不会在任何地方打电话给新人.只有当一个全局对象包含另一个对象时才会链接所有这些代码.
例如:
class UartA {
...
private:
Ringbuffer* rxbuf;
};
class UartB {
...
private:
Ringbuffer rxbuf;
};
Run Code Online (Sandbox Code Playgroud)
如果创建了UartA的全局实例,则不会链接异常处理,operator new和stdio内容.这就是我想要的.
如果创建了UartB的全局实例(其中rxbuf是实例而不是指针),则链接不需要的代码.
UartA和UartB都不使用operator new,exception或stdio.它们的区别仅在于rxbuf的类型.
你能建议如何防止链接额外的代码吗?另外,为什么这与UartB相关联,而不是UartA?