即使没有使用STM32 gcc(arm-none-eabi-gcc)也会链接printf

时间:2016-10-04 17:05:03

标签: gcc linker arm printf stm32

我似乎无法弄清楚为什么有些printf库函数会从libc_nano.a链接到我的代码中,即使我从不使用任何printf。它窃取了至少2K宝贵的闪存空间。我可以在链接器映射文件中看到_printf_i_vfprintf_r_vfiprintf_r等部分。

我试过

  • Wl, - exclude-libs选项
  • 链接描述文件中的EXCLUDE_FILE(..)

这些都不会使符号从地图文件中消失..

我的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。这是免费软件;看到了   复制条件的来源。没有保修;甚至没有   适销性或适用于特定目的。

首先,他们为什么要联系起来? 有没有方法可以排除它们?

1 个答案:

答案 0 :(得分:5)

告诉链接器生成交叉引用:-Wl,--cref

  

- cref

     

输出交叉参考表。如果正在生成链接器映射文件,则交叉引用表将打印到映射文件。   否则,它将打印在标准输出上。格式   表是故意简单的,因此它可以很容易地处理   脚本如有必要。打印出符号,按名称排序。对于   每个符号,给出一个文件名列表。如果符号已定义,   列出的第一个文件是定义的位置。剩余的   文件包含对符号的引用。

查找以其中一个打印符号开头的行及其下方的行。

grep -A5 _printf *.map

在那里,您将找到内部使用printf的库函数。