我正在用 C++ 开发裸机 cortex-M3,以获取乐趣和利润。我使用 STL 库,因为我需要一些容器。我认为通过简单地提供我的分配器,它不会向最终的二进制文件添加太多代码,因为您只得到您使用的内容。
实际上我根本没想到与 STL 有任何链接过程
(给出我的分配器),因为我认为这都是模板代码。
我正在编译-fno-exception
顺便一提。
不幸的是,我的二进制文件中添加了大约 600KB 或更多。我用 nm 查找了最终二进制文件中包含哪些符号,这对我来说似乎是一个笑话。这个列表太长了,我不会尝试跳过它。虽然有一些弱符号。
我还查看了链接器生成的 .map 文件,甚至找到了 scanf 符号
.text
0x000158bc 0x30 /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)
0x000158bc __sscanf
0x000158bc sscanf
0x000158bc _IO_sscanf
And:
$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf
我该如何调试这个?首先,我想了解 GCC 到底使用什么来进行链接(我通过 GCC 进行链接)。我知道如果在文本段中找到符号,
使用了整个段,但仍然太多了。
任何有关如何解决此问题的建议将不胜感激。
Thanks
使用 GCC-v
and -Wl,-v
选项将显示正在使用的链接器命令(以及链接器的版本信息)。
您使用的是哪个版本的 GCC?我对 GCC 4.6 做了一些更改(请参阅PR 44647 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44647 and PR 43863 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43863)以减少代码大小以帮助嵌入式系统。还有一个未完成的增强请求(PR 43852 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43852)以允许禁用您所看到的 IO 符号的包含 - 其中一些来自详细终止处理程序,当进程因活动异常而终止时,该处理程序会打印一条消息。如果您不使用执行,那么其中一些代码对您来说是无用的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)