gpt4 book ai didi

c++ - 如何调试 STL/C++ 的 GCC/LD 链接过程

转载 作者:可可西里 更新时间:2023-11-01 16:10:25 28 4
gpt4 key购买 nike

我正在使用 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

和:

$ 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 进行链接)。我知道如果在文本段中找到符号,则使用了整个片段,但仍然太多了。

任何有关如何解决此问题的建议都将不胜感激。

谢谢

最佳答案

使用 GCC 的 -v-Wl,-v 选项将显示正在使用的链接器命令(和链接器的版本信息)。

您使用的是哪个版本的 GCC?我对 GCC 4.6 进行了一些更改(参见 PR 44647PR 43863 )以减少代码大小以帮助嵌入式系统。还有一个未完成的增强请求 ( PR 43852 ) 允许禁用您看到的 IO 符号的包含 - 其中一些来自详细的终止处理程序,当进程因事件异常而终止时打印一条消息。如果您不使用执行程序,那么其中一些代码对您来说毫无用处。

关于c++ - 如何调试 STL/C++ 的 GCC/LD 链接过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com