The answer is quite simple (in my case):
I am using CMake to build my project and it is inserting the flag -rdynamic
!
To my knowledge the combination of -rdynamic
and --gc-sections
options is not mentioned anywhere in the GCC documentation. There should be a warning like this:
-rdynamic
renders --gc-sections
useless bcs. all symbols are implicitly referenced.
See also: What exactly does `-rdynamic` do and when exactly is it needed?
Of course only CMake users are affected by this... (without knowing):
CMP0065
Do not add flags to export symbols from executables without the
:prop_tgt:ENABLE_EXPORTS
target property.
CMake 3.3 and below, for historical reasons, always linked executables
on some platforms with flags like -rdynamic
to export symbols from
the executables for use by any plugins they may load via dlopen
.
CMake 3.4 and above prefer to do this only for executables that are
explicitly marked with the :prop_tgt:ENABLE_EXPORTS
target property.
The OLD
behavior of this policy is to always use the additional
link flags when linking executables regardless of the value of the
:prop_tgt:ENABLE_EXPORTS
target property.
The NEW
behavior of this policy is to only use the additional link
flags when linking executables if the :prop_tgt:ENABLE_EXPORTS
target property is set to True
.
This policy was introduced in CMake version 3.4. Unlike most
policies, CMake version |release| does not warn by default when this
policy is not set and simply uses OLD behavior. See documentation of
the :variable:CMAKE_POLICY_WARNING_CMP0065
<CMAKE_POLICY_WARNING_CMP<NNNN>>
variable to control the warning.
To get rid of the mostly unnecessary -rdynamic
CMakeLists.txt just add cmake_policy(SET CMP0065 NEW)