You copied the Doc URL to your clipboard.

Arm Compiler armlink User Guide : Elimination of unused sections

Elimination of unused sections

Elimination of unused sections is the most significant optimization on image size that the linker performs.

Unused section elimination:

  • Removes unreachable code and data from the final image.
  • Is suppressed in cases that might result in the removal of all sections.

To control this optimization, use the --remove, --no_remove, --first, --last, and --keep linker options.

Unused section elimination requires an entry point. Therefore, if no entry point is specified for an image, use the --entry linker option to specify an entry point.

Use the --info unused linker option to instruct the linker to generate a list of the unused sections that it eliminates.

An input section is retained in the final image when:

  • It contains an entry point or an externally accessible symbol, for example, an entry function into the secure code for Armv8‑M Security Extensions.
  • It is specified as the first or last input section, either by the --first or --last option or by a scatter-loading equivalent.
  • It is marked as unremovable by the --keep option.
  • It is referred to, directly or indirectly, by a non-weak reference from an input section retained in the image.
  • Its name matches the name referred to by an input section symbol, and that symbol is referenced from a section that is retained in the image.


Compilers usually collect functions and data together and emit one section for each category. The linker can only eliminate a section if it is entirely unused.

You can mark a function or variable in source code with the __attribute__((used)) attribute. This attribute causes armclang to generate the symbol __tagsym$$used.num for each function or variable, where num is a counter to differentiate each symbol. Unused section elimination does not remove a section that contains __tagsym$$used.num.

You can also use the -ffunction-sections compiler command-line option to instruct the compiler to generate one ELF section for each function in the source file.