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

hga*_*abe 5 linker printf gcc arm 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 
Run Code Online (Sandbox Code Playgroud)

arm-none-eabi-gcc.exe(适用于ARM嵌入式处理器的GNU工具)5.2.1 20151202(re lease)[ARM/embedded-5-branch revision 231848] Copyright(C)2015 Free Software Foundation,Inc.这是免费的软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

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

ber*_*ing 5

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

--cref

输出交叉引用表.如果正在生成链接器映射文件,则交叉引用表将打印到映射文件.否则,它将打印在标准输出上.表的格式有意简单,因此如果需要,可以通过脚本轻松处理.打印出符号,按名称排序.对于每个符号,给出了文件名列表.如果定义了符号,则列出的第一个文件是定义的位置.其余文件包含对符号的引用.

查找以其中一个打印符号开头的行以及它下面的行.

grep -A5 _printf *.map
Run Code Online (Sandbox Code Playgroud)

在那里你会发现内部使用printf的库函数.