Arm® Compiler generates
complete objects for linking. Therefore:
If there are inline functions in C and C++ sources, each object contains the
out-of-line copies of the inline functions that the object requires.
If templates are used in C++ sources, each object contains the template functions
that the object requires.
When these functions are declared in a common header file, the functions might be defined
many times in separate objects that are subsequently linked together. To eliminate
duplicates, the compiler compiles these functions into separate instances of common section groups.
It is possible that the separate instances of common section groups, are not
identical. Some of the copies, for example, might be found in a library that has been built
with different, but compatible, build options, different optimization, or debug options.
If the copies are not identical, armlink retains the best available
variant of each common section group, based on the attributes of the input objects.
armlink discards the rest.
If the copies are identical, armlink retains the first section group
located.
You control this optimization with the following linker options:
Use the --bestdebug
option to use the largest common data (COMDAT)
group (likely to give the best debug view).
Use the --no_bestdebug
option to use the smallest COMDAT group
(likely to give the smallest code size). This is the default.
The image changes if you compile all files
containing a COMDAT group A with -g
, even if you use
--no_bestdebug
.