It is important to mark ISRs and other functions that the compiler may think are never called with the attribute USED.
#define ATTR_USED __attribute__ ((used))
Aggressive removal of code can remove things that are actually used, however the compiler may not be able to track their usage to know they are used.
This in a way defeats what LTO was meant to do, remove dead code. Comes down to proper code hygiene.
There should be no dead code that needs removed.
Also GCC 5.0 and GCC 5.1 are broken and shall not be used. Use 4.8/4.9 or 5.2q4.