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
--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.
--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 an
- It is specified as the first or last input section, either by the
--lastoption or by a scatter-loading equivalent.
- It is marked as unremovable by the
- 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
__tagsym$$used. for each
function or variable, where
is a counter to
differentiate each symbol. Unused section elimination does not remove a section that
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.