https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78747
Jan Engelhardt <jengelh at inai dot de> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #4 from Jan Engelhardt <jengelh at inai dot de> ---
>So, are version-scripts with local:* basically incompatible with C++?
Answering myself: yes.
Symbols from library headers (inlines, typeinfos) can be spill-duplicated into
one's own program, such is the nature of contemporary C++ compilation.
Due to ODR, linkers need to collapse duplicate symbols. Only ELF global symbols
participate.
-fvisibility=hidden changes the default symbol visibility. A proper library
header therefore declares __attribute__((visibility("default"))) for its
exports; this way, the visibility of those spilled library symbols will stay
correct even if one's program is built with -fvisibility=hidden.
Version scripts however have the power to force-downgrade the visibility of
symbols in one's program, inhibiting the required collapse. So probably avoid
local:* when linking a C++ lib.