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?

Reply via email to