https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50483
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So what is happening is bar is being coming localized to the newly produced assembly file which is the same as being hidden really. If we do: void bar() __attribute((visibility( "hidden" ), externally_visible)); The new assembly file in both cases produces: .globl _Z3barv .hidden _Z3barv Without the externally_visible, the function does not have a .globl to it. This is also why in both with and without -flto dynsym does not have the symbol there. There is no bug to be fixed, LTO is doing the localizing rather than the linker doing it.