13

从任何自动生成的 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/”的输出节的任何输入节都不包含在输出文件中。

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

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

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

1 回答 1

1

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

于 2020-05-13T19:17:00.593 回答