While I was trying to fit an application in a limited space I noticed that the compiler/linker does not appear to remove functions that are uncalled across C files.
I have a number of C files that are common to a number of applications but not all of these functions are called by all applications.
If I comment out these functions the application will then reduce in size, so I am pretty sure the linker is not removing these (or at least part of these) unused functions. This is regardless of the optimisation level I have set for the compiler.
Ideally I want the compiler/linker to remove these functions automatically.
I have trawled through the options on armlink but I cant seem to find what I want.
I am pretty sure I am missing something obvious. So can anyone explain how I achieve this?
Thanks
Thanks Mr Shy that is exactly what I wanted, it works well.
Just a note but traditional linkers works on object files, and not on functions/variables inside object files. So any support by a linker to strip out functions or variables within an object file is a quite advanced feature.
Because of this, a traditional CRTL often contains thousands of C files, just to create thousands of object files just to let the linker select on a symbol-by-symbol level what to include in the final binary.
Isn't it straightforward for the compiler to place each function and static-storage-duration variable into it's own section (or whetever the smallest unit for the linker would be called)? That way the linker can keep track of dependencies and remove unused functions and variables. One reason I can think of against this is this would limit compiler optimization scope to function boundaries. The mechanism used in RealView allows the compiler to expand optimization scope to the whole source code and remove unused functions. This comes at the cost of an extra recompile.
Yes, it's possible to play with linker or with compiler.
I just wanted to note that it does take some extra steps in the tools to perform removal of unused functions. And these extra steps can't be taken for granted. They obviously are very valuable for embedded programming since the available space is so important.