STM32 gcc(arm-none-eabi-gcc)即使没有使用,仍然链接printf。

6
我似乎无法理解为什么我的代码会从libc_nano.a库中链接一些printf库函数,即使我从未使用过任何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 (GNU Tools for ARM Embedded Processors) 5.2.1 20151202 (release) [ARM/embedded-5-branch revision 231848]版权所有 (C) 2015自由软件基金会。这是免费软件;请查看源代码以了解复制条件。没有任何保证;甚至适用于特定目的的适销性或适用性。

首先,为什么它们被链接在一起?有没有方法可以排除它们?"


你尝试过使用-nostdinc编译并使用-nostdlib链接吗? - Jean-François Fabre
是的,我试过了,很奇怪的是代码可以成功编译和链接,但是尺寸变得如此之大,以至于无法适应设备的闪存内存。我想链接器会退而使用其他东西而不是libc_nano。 - hgabe
1个回答

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

--cref

输出交叉引用表。如果正在生成链接器映射文件,则交叉引用表将打印到映射文件中。否则,它会被打印在标准输出上。表格的格式故意保持简单,以便必要时可以轻松地通过脚本进行处理。符号按名称排序后打印出来。对于每个符号,都会给出文件名列表。如果定义了该符号,则列出的第一个文件是定义的位置。其余文件包含对该符号的引用。

查找以一个打印符号开头的行及其以下行。
grep -A5 _printf *.map

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


1
交叉引用表发挥了魔力。我的代码在某处使用了assert,它引用了printf和其他函数。删除assert后,我的代码大小减少了超过4K! - hgabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接