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

emi*_*rax 10 c++ embedded linker gcc stl

我正在研究C++中的裸机皮质-3M,以获得乐趣和利润.我使用STL库,因为我需要一些容器.我认为通过简单地提供我的分配器,它不会为最终二进制文件添加太多代码,因为你只得到你使用的东西.

我实际上甚至没有想到任何链接过程与STL(给我的分配器),因为我认为这是所有模板代码.

-fno-exception顺便说一句,我正在编译.

不幸的是,我的二进制文件中添加了大约600KB或更多.我查找了最终二进制文件中包含哪些符号,这对我来说似乎是一个笑话.这份清单太长了,我不会试着过去.虽然有一些弱的符号.

我还查看了链接器生成的.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
Run Code Online (Sandbox Code Playgroud)

和:

$ 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
Run Code Online (Sandbox Code Playgroud)

我该怎么调试呢?首先,我想了解GCC究竟用于链接(我通过GCC链接).我知道如果在文本段中找到符号,则使用整个段,但仍然太多了.

任何关于如何解决这个问题的建议都会受到赞赏.

谢谢

Jon*_*ely 5

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

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