我似乎无法弄清楚为什么有些printf
库函数会从libc_nano.a链接到我的代码中,即使我从不使用任何printf
。它窃取了至少2K宝贵的闪存空间。我可以在链接器映射文件中看到_printf_i
,_vfprintf_r
,_vfiprintf_r
等部分。
我试过
这些都不会使符号从地图文件中消失..
我的gcc选项:
CFLAGS = -Og -Wall -g3 -Wdouble-promotion -mcpu=cortex-m0 -mthumb -fmessage-length=0 -ffunction-sections -mfloat-abi=soft -DUSE_HAL_DRIVER
LFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -Wl,--gc-sections
arm-none-eabi-gcc.exe(适用于ARM嵌入式处理器的GNU工具)5.2.1 20151202(re lease)[ARM / embedded-5-branch revision 231848]版权所有 (C)2015 Free Software Foundation,Inc。这是免费软件;看到了 复制条件的来源。没有保修;甚至没有 适销性或适用于特定目的。
首先,他们为什么要联系起来? 有没有方法可以排除它们?
答案 0 :(得分:5)
告诉链接器生成交叉引用:-Wl,--cref
- cref
输出交叉参考表。如果正在生成链接器映射文件,则交叉引用表将打印到映射文件。 否则,它将打印在标准输出上。格式 表是故意简单的,因此它可以很容易地处理 脚本如有必要。打印出符号,按名称排序。对于 每个符号,给出一个文件名列表。如果符号已定义, 列出的第一个文件是定义的位置。剩余的 文件包含对符号的引用。
查找以其中一个打印符号开头的行及其下方的行。
grep -A5 _printf *.map
在那里,您将找到内部使用printf的库函数。