为什么STM32 gcc链接程序脚本会自动丢弃以下标准库中的所有输入节:libc.a,libm.a,libgcc.a?

Gab*_*les 5 c linker stm32 ld binutils

从任何自动生成的STM32CubeMx生成的链接器脚本的底部:

/* Remove information from the standard libraries */
/DISCARD/ :
{
  libc.a ( * )
  libm.a ( * )
  libgcc.a ( * )
}
Run Code Online (Sandbox Code Playgroud)

从GNU Binutils ld(链接程序脚本)手册中,3.6.7输出节丢弃

特殊输出节名称“ / DISCARD /”可用于丢弃输入节。分配给名为“ / DISCARD /”的输出节的任何输入节均不包含在输出文件中。

这3个输入目标文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?

其他感兴趣的STM32链接器脚本主题:

  1. 在C中访问链接描述文件变量的“值”是否存在未定义的行为?
  2. 如何从C获取ld链接程序脚本中定义的变量的值

小智 3

在此示例中,/DISCARD/删除了脚本未明确定义的任何其他部分。例如,由于*(.text)*(.data)*(.bss)*(.init_array)已在脚本中前面定义,因此它们进入 ELF。但是libclibmlibgcc可能包含不必要的固件部分(例如 .foo、.bar、.debug ...),因此 /DISCARD/ 只是将它们擦除,但不是所有部分!