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?