hga*_*abe 5 linker printf gcc arm stm32
我似乎无法弄清楚为什么有些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
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.这是免费的软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.
首先,他们为什么要联系起来?有没有办法排除它们?
告诉链接器生成交叉引用: -Wl,--cref
--cref
输出交叉引用表.如果正在生成链接器映射文件,则交叉引用表将打印到映射文件.否则,它将打印在标准输出上.表的格式有意简单,因此如果需要,可以通过脚本轻松处理.打印出符号,按名称排序.对于每个符号,给出了文件名列表.如果定义了符号,则列出的第一个文件是定义的位置.其余文件包含对符号的引用.
查找以其中一个打印符号开头的行以及它下面的行.
grep -A5 _printf *.map
Run Code Online (Sandbox Code Playgroud)
在那里你会发现内部使用printf的库函数.