https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83834
nsz at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |nsz at gcc dot gnu.org --- Comment #7 from nsz at gcc dot gnu.org --- the difference between the old and new ld for me is that, with the new ld i see: Run till exit from #0 lang_vers_match (head=0x60a6b8, prev=0x0, sym=0x6e9f2f "_ZZSt9call_onceIMSt6threadFvvEJSt17reference_wrapperIS0_EEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv") at ../../ld/ldlang.c:8116 0x000000000045adbc in bfd_find_version_for_sym (verdefs=<optimized out>, sym_name=0x6e9f2f "_ZZSt9call_onceIMSt6threadFvvEJSt17reference_wrapperIS0_EEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv", hide=0xffffffffde64, hide@entry=0xffffffffde74) at ../../bfd/linker.c:3181 3181 while ((d = (*t->match) (&t->globals, d, sym_name)) != NULL) Value returned is $9 = (struct bfd_elf_version_expr *) 0x602120 (gdb) p *$9 $10 = {next = 0x6020e0, pattern = 0x602100 "std::c[a-g]*", literal = 0, symver = 0, script = 1, mask = 2} the old ld here returns NULL. so the the "std::c[a-g]*" pattern in libstdc++-symbols.ver matches "_ZZSt9call_onceIMSt6threadFvvEJSt17reference_wrapperIS0_EEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv" in the new ld, but not in the old one. with c++filt the symbol is: void std::call_once<void (std::thread::*)(), std::reference_wrapper<std::thread> >(std::once_flag&, void (std::thread::*&&)(), std::reference_wrapper<std::thread>&&)::{lambda()#2}::_FUN() which one is the correct behaviour? should this match or not?