从任何自动生成的STM32CubeMx生成的链接器脚本的底部:
/* Remove information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
摘自GNU Binutils ld(链接程序脚本)手册,3.6.7 Output Section Discarding:
特殊输出节名称“ / DISCARD /”可用于丢弃输入节。输出文件中不包含分配给名为“ / DISCARD /”的输出节的任何输入节。
这三个输入对象文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?
看起来像在此示例中,/DISCARD/
删除脚本未明确定义的任何其他节。例如,由于*(.text)
,*(.data)
,*(.bss)
,*(.init_array)
等已在脚本的前面定义,因此它们进入了ELF。但是libc,libm或libgcc可能包含不必要的固件部分(例如.foo,.bar,.debug ...),因此/ DISCARD /只会擦除它们,但不能所有部分!