From the bottom of any auto-generated STM32CubeMx-generated linker script:
/* Remove information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
From the GNU Binutils ld (linker script) manual, 3.6.7 Output Section Discarding:
The special output section name ‘/DISCARD/’ may be used to discard input sections. Any input sections which are assigned to an output section named ‘/DISCARD/’ are not included in the output file.
What do these 3 input object files contain, and why do we discard everything (all input sections) from them?
Looks like in this example, /DISCARD/
removes any other sections, that are not explicitly defined by script. For example, since *(.text)
, *(.data)
, *(.bss)
, *(.init_array)
etc, has been defined earlier in the script, they get into the ELF. But libc, libm or libgcc could contain unnecessary sections for firmware (e.g. .foo, .bar, .debug ...), so /DISCARD/ just wipes them out, but NOT all sections!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With