为啥 STM32 gcc 链接器脚本会自动丢弃这些标准库中的所有输入节:libc.a、libm.a、libgcc.a?

Posted

技术标签:

【中文标题】为啥 STM32 gcc 链接器脚本会自动丢弃这些标准库中的所有输入节:libc.a、libm.a、libgcc.a?【英文标题】:Why do STM32 gcc linker scripts automatically discard all input sections from these standard libraries: libc.a, libm.a, libgcc.a?为什么 STM32 gcc 链接器脚本会自动丢弃这些标准库中的所有输入节:libc.a、libm.a、libgcc.a? 【发布时间】:2019-09-01 11:15:11 【问题描述】:

从任何自动生成的 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 链接器脚本主题:

    Is accessing the "value" of a linker script variable undefined behavior in C? How to get value of variable defined in ld linker script from C

【问题讨论】:

我认为要得到这个答案,需要有人直接去问 ST 公司和/或 ARM 公司,然后反馈。 【参考方案1】:

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

【讨论】:

以上是关于为啥 STM32 gcc 链接器脚本会自动丢弃这些标准库中的所有输入节:libc.a、libm.a、libgcc.a?的主要内容,如果未能解决你的问题,请参考以下文章

为啥链接器无法识别我的链接器脚本中定义的入口点

STM32链接器脚本初始化部分,使用C时需要它们吗?

STM32 链接器脚本仅用于来自 FLASH 的启动脚本,其他一切来自 RAM

GCC - 如何停止 malloc 被链接?

使用keil软件时,建的项目,为啥会自动变成压缩包

如何在命令行中使 gcc 链接器输出节大小?