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

问题描述 投票:7回答:1

从任何自动生成的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 /”的输出节的任何输入节。

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

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

  1. Is accessing the "value" of a linker script variable undefined behavior in C?
  2. How to get value of variable defined in ld linker script from C
c linker stm32 ld binutils
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.