首页 文章

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

提问于
浏览
4

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

我试过了

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

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

我的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(再租赁)[ARM / embedded-5-branch revision 231848] Copyright(C)2015 Free Software Foundation,Inc . 这是免费软件;查看复制条件的来源 . 没有保修;甚至不适用于适销性或特定用途的适用性 .

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

1 回答

  • 5

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

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

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

    grep -A5 _printf *.map
    

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

相关问题