When debugging my program, I noticed that several symbols in a recursive template failed. The simplest one is: _Z7extractILc9ELi0EEbN7strings7XStringE6RecordIXT_EXT0_EJEE I noticed a similar case in libiberty test data: _Z1gIJidEEDTclL_Z1fEspplfp_Li1EEEDpT_ Talking directly to libiberty, my symbol also demangles. I have not observed any difference between my symbol and that one. The test entry specifies gnu-v3 (I haven't found any documentation on how that is different than gnu - older or newer?), but (gdb) set demangle-style gnu-v3 does not make maintenance demangle accept it. I have not observed any difference between gdb 7.6 and gdb trunk. Note: the c++filt program, which is part of binutils, learned to understand the symbol sometime between 2.22 and 2.23 Incidentally, this bug is an *excellent* argument for why static libraries (and/or copylibs) need to die.
The two examples given demangle for me using 7.6.50.20130729-cvs, and they both demangle identically to the Fedora 18 system c++filt (version 2.23.51.0.1-6.fc18 20120806): $ ./gdb -nx -q (gdb) set lang c++ (gdb) maint demangle _Z7extractILc9ELi0EEbN7strings7XStringE6RecordIXT_EXT0_EJEE bool extract<(char)9, 0>(strings::XString, Record<(char)9, 0>) (gdb) maint demangle _Z1gIJidEEDTclL_Z1fEspplfp_Li1EEEDpT_ decltype (f(({parm#1}+(1))...)) g<int, double>(int, double) In fact, I tried the 7.6 branch, and that, too, works the same way. So there is something unique to your situation that is causing you problems. Do you have a test case that you can share?
I didn't realize you had to (gdb) set lang c++ I recommend a warning; I did not expect this from (gdb) help maint demangle There *is*, however, still the bug that originally lead me on this hunt: A previous version of gcc (4.6) mangled symbols wrong (I instead of J for packs; I did read the mangling ABI spec), so (for bugward ABI compatibility) recent versions of gcc (4.7, 4.8) emit two symbols pointing to the same address. I don't know if there actually remains enough information to consistently pick the right one, unless you do a hacky heuristic like "if there is more than one symbol for an address, prefer the one with more Js and less Is". Oddly, however, c++filt 2.23 sometimes manages to demangle even the incorrect mangling. But gdb sometimes gives up and sometimes produces a totally bogus demangling (c++filt does not do this). The exact details of this problem are hard to investigate because of bug 12707 ... it sometimes makes a difference whether debug symbols are on or off. I'll make an attachment with some further commentary.
Created attachment 7127 [details] my original program, trimmed as much as possible without breaking types very much Some observations: gcc 4.6 is best to test with, since it *only* emits the wrong symbols. With gcc 4.7 and gcc 4.8, this might be a heisenbug. clang only emits the right symbols (but clang is still useless for compiling programs to be debugged). puts() is there just to set a nice breakpoint. The need to explicitly call 'set lang c++' before 'maint demangle' is *really* annoying when using 'up' or 'frame' after a call to a C library. Hm ... cosmetic issue, but perhaps gdb should not print the () if it successfully demangles a name and it's not printing arguments backtrace for gcc 4.6, attempting demangling: (gdb) bt #0 _IO_puts (str=0x4015ec "hello") at ioputs.c:34 #1 0x00000000004014ed in bool extract<(char)32, global_reg>(strings::XString, VRecord<(char)32, global_reg>) () #2 0x0000000000401493 in bool extract<(char)9, 1, VRecord<(char)32, global_reg>>(strings::XString, Record<(char)9, 1, VRecord<(char)32, global_reg>>) () #3 0x0000000000401422 in extract<(char)9, 2, TimeT<VRecord<(char)32, global_reg> >*> () #4 0x0000000000401391 in bool extract<(char)9, 3, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 3, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #5 0x00000000004012e7 in extract<(char)9, 4, IP_String<strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >*> () #6 0x0000000000401228 in extract<(char)9, 5, TimeT<IP_String*, strings::VString<(unsigned char)254>*, IP_String, VRecord<(char)32, global_reg> >*> () #7 0x000000000040115c in extract<(char)9, 6, timestamp_seconds_buffer<TimeT*, IP_String*, strings::VString<(unsigned char)254>*, IP_String, VRecord<(char)32, global_reg> >*> () #8 0x0000000000401083 in extract<(char)9, 7, AccountEmail<timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, IP_String, VRecord<(char)32, global_reg> >*> () #9 0x0000000000400fa7 in bool extract<(char)9, 8, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 8, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #10 0x0000000000400eb8 in bool extract<(char)9, 9, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 9, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #11 0x0000000000400da8 in bool extract<(char)9, 10, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 10, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #12 0x0000000000400c86 in _Z7extractILc9ELi11EP29timestamp_milliseconds_bufferIPN7strings7VStringILh1EEEPiS6_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS3_ILh254EEESC_7VRecordILc32E10global_regEEEbNS2_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #13 0x0000000000400b52 in _Z7extractILc9ELi12EP12AccountCryptIP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEEPiS8_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS5_ILh254EEESE_7VRecordILc32E10global_regEEEbNS4_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #14 0x0000000000400a0d in _Z7extractILc9ELi13EP11AccountNameIP12AccountCryptP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEEPiSA_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS7_ILh254EEESG_7VRecordILc32E10global_regEEEbNS6_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #15 0x00000000004008ac in bool extract<(char)9, 14, int*, AccountName*, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 14, int*, AccountName*, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #16 0x00000000004006fc in extract(strings::XString, AuthData*) () #17 0x000000000040073d in mmo_auth_init(strings::XString) () #18 0x0000000000400752 in main () backtrace for gcc 4.6, no demangling: (gdb) bt #0 _IO_puts (str=0x4015ec "hello") at ioputs.c:34 #1 0x00000000004014ed in _Z7extractILc32E10global_regEbN7strings7XStringE7VRecordIXT_ET0_E () #2 0x0000000000401493 in _Z7extractILc9ELi1E7VRecordILc32E10global_regEIEEbN7strings7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #3 0x0000000000401422 in _Z7extractILc9ELi2EP5TimeTI7VRecordILc32E10global_regEEEbN7strings7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #4 0x0000000000401391 in _Z7extractILc9ELi3EPN7strings7VStringILh254EEEIP5TimeT7VRecordILc32E10global_regEEEbNS0_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #5 0x00000000004012e7 in _Z7extractILc9ELi4EP9IP_StringIPN7strings7VStringILh254EEEP5TimeT7VRecordILc32E10global_regEEEbNS2_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #6 0x0000000000401228 in _Z7extractILc9ELi5EP5TimeTIP9IP_StringPN7strings7VStringILh254EEES1_7VRecordILc32E10global_regEEEbNS4_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #7 0x000000000040115c in _Z7extractILc9ELi6EP24timestamp_seconds_bufferIP5TimeTP9IP_StringPN7strings7VStringILh254EEES3_7VRecordILc32E10global_regEEEbNS6_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #8 0x0000000000401083 in _Z7extractILc9ELi7EP12AccountEmailIP24timestamp_seconds_bufferP5TimeTP9IP_StringPN7strings7VStringILh254EEES5_7VRecordILc32E10global_regEEEbNS8_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #9 0x0000000000400fa7 in _Z7extractILc9ELi8EPiIP12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPN7strings7VStringILh254EEES6_7VRecordILc32E10global_regEEEbNS9_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #10 0x0000000000400eb8 in _Z7extractILc9ELi9EPiIS0_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPN7strings7VStringILh254EEES6_7VRecordILc32E10global_regEEEbNS9_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #11 0x0000000000400da8 in _Z7extractILc9ELi10EPN7strings7VStringILh1EEEIPiS4_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS1_ILh254EEESA_7VRecordILc32E10global_regEEEbNS0_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #12 0x0000000000400c86 in _Z7extractILc9ELi11EP29timestamp_milliseconds_bufferIPN7strings7VStringILh1EEEPiS6_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS3_ILh254EEESC_7VRecordILc32E10global_regEEEbNS2_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #13 0x0000000000400b52 in _Z7extractILc9ELi12EP12AccountCryptIP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEEPiS8_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS5_ILh254EEESE_7VRecordILc32E10global_regEEEbNS4_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #14 0x0000000000400a0d in _Z7extractILc9ELi13EP11AccountNameIP12AccountCryptP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEEPiSA_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS7_ILh254EEESG_7VRecordILc32E10global_regEEEbNS6_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #15 0x00000000004008ac in _Z7extractILc9ELi14EPiIP11AccountNameP12AccountCryptP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEES0_S0_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS8_ILh254EEESG_7VRecordILc32E10global_regEEEbNS7_7XStringE6RecordIXT_EXT0_EIT1_DpT2_EE () #16 0x00000000004006fc in _ZL7extractN7strings7XStringEP8AuthData () #17 0x000000000040073d in _Z13mmo_auth_initN7strings7XStringE () #18 0x0000000000400752 in main () backtrace for clang, with demangling: #0 _IO_puts (str=0x40247c "hello") at ioputs.c:34 #1 0x000000000040239c in bool extract<(char)32, global_reg>(strings::XString, VRecord<(char)32, global_reg>) () #2 0x000000000040234d in bool extract<(char)9, 1, VRecord<(char)32, global_reg>>(strings::XString, Record<(char)9, 1, VRecord<(char)32, global_reg>>) () #3 0x0000000000402317 in bool extract<(char)9, 2, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 2, TimeT*, VRecord<(char)32, global_reg> >) () #4 0x0000000000402298 in bool extract<(char)9, 3, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 3, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #5 0x00000000004021f9 in bool extract<(char)9, 4, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 4, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #6 0x0000000000402140 in bool extract<(char)9, 5, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 5, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #7 0x0000000000402090 in bool extract<(char)9, 6, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 6, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #8 0x0000000000401fe8 in bool extract<(char)9, 7, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 7, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #9 0x0000000000401f58 in bool extract<(char)9, 8, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 8, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #10 0x0000000000401ec0 in bool extract<(char)9, 9, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 9, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #11 0x0000000000401e00 in bool extract<(char)9, 10, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 10, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #12 0x0000000000401d48 in bool extract<(char)9, 11, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 11, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #13 0x0000000000401c7b in bool extract<(char)9, 12, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 12, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #14 0x0000000000401ba9 in bool extract<(char)9, 13, AccountName*, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 13, AccountName*, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #15 0x000000000040094f in bool extract<(char)9, 14, int*, AccountName*, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >(strings::XString, Record<(char)9, 14, int*, AccountName*, AccountCrypt*, timestamp_milliseconds_buffer*, strings::VString<(unsigned char)1>*, int*, int*, AccountEmail*, timestamp_seconds_buffer*, TimeT*, IP_String*, strings::VString<(unsigned char)254>*, TimeT*, VRecord<(char)32, global_reg> >) () #16 0x0000000000400879 in extract(strings::XString, AuthData*) () #17 0x0000000000400685 in mmo_auth_init(strings::XString) () #18 0x000000000040089d in main () backtrace for clang, no demangling: (gdb) bt #0 _IO_puts (str=0x40247c "hello") at ioputs.c:34 #1 0x000000000040239c in _Z7extractILc32E10global_regEbN7strings7XStringE7VRecordIXT_ET0_E () #2 0x000000000040234d in _Z7extractILc9ELi1E7VRecordILc32E10global_regEJEEbN7strings7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #3 0x0000000000402317 in _Z7extractILc9ELi2EP5TimeTJ7VRecordILc32E10global_regEEEbN7strings7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #4 0x0000000000402298 in _Z7extractILc9ELi3EPN7strings7VStringILh254EEEJP5TimeT7VRecordILc32E10global_regEEEbNS0_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #5 0x00000000004021f9 in _Z7extractILc9ELi4EP9IP_StringJPN7strings7VStringILh254EEEP5TimeT7VRecordILc32E10global_regEEEbNS2_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #6 0x0000000000402140 in _Z7extractILc9ELi5EP5TimeTJP9IP_StringPN7strings7VStringILh254EEES1_7VRecordILc32E10global_regEEEbNS4_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #7 0x0000000000402090 in _Z7extractILc9ELi6EP24timestamp_seconds_bufferJP5TimeTP9IP_StringPN7strings7VStringILh254EEES3_7VRecordILc32E10global_regEEEbNS6_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #8 0x0000000000401fe8 in _Z7extractILc9ELi7EP12AccountEmailJP24timestamp_seconds_bufferP5TimeTP9IP_StringPN7strings7VStringILh254EEES5_7VRecordILc32E10global_regEEEbNS8_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #9 0x0000000000401f58 in _Z7extractILc9ELi8EPiJP12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPN7strings7VStringILh254EEES6_7VRecordILc32E10global_regEEEbNS9_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #10 0x0000000000401ec0 in _Z7extractILc9ELi9EPiJS0_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPN7strings7VStringILh254EEES6_7VRecordILc32E10global_regEEEbNS9_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #11 0x0000000000401e00 in _Z7extractILc9ELi10EPN7strings7VStringILh1EEEJPiS4_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS1_ILh254EEESA_7VRecordILc32E10global_regEEEbNS0_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #12 0x0000000000401d48 in _Z7extractILc9ELi11EP29timestamp_milliseconds_bufferJPN7strings7VStringILh1EEEPiS6_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS3_ILh254EEESC_7VRecordILc32E10global_regEEEbNS2_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #13 0x0000000000401c7b in _Z7extractILc9ELi12EP12AccountCryptJP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEEPiS8_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS5_ILh254EEESE_7VRecordILc32E10global_regEEEbNS4_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #14 0x0000000000401ba9 in _Z7extractILc9ELi13EP11AccountNameJP12AccountCryptP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEEPiSA_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS7_ILh254EEESG_7VRecordILc32E10global_regEEEbNS6_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #15 0x000000000040094f in _Z7extractILc9ELi14EPiJP11AccountNameP12AccountCryptP29timestamp_milliseconds_bufferPN7strings7VStringILh1EEES0_S0_P12AccountEmailP24timestamp_seconds_bufferP5TimeTP9IP_StringPNS8_ILh254EEESG_7VRecordILc32E10global_regEEEbNS7_7XStringE6RecordIXT_EXT0_EJT1_DpT2_EE () #16 0x0000000000400879 in _ZL7extractN7strings7XStringEP8AuthData () #17 0x0000000000400685 in _Z13mmo_auth_initN7strings7XStringE () #18 0x000000000040089d in main ()
For the interest of anyone else needing to work around this: I found the original gcc bug: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51322 which fortunately gives a way to stop the wrong symbols from being emitted for compatibility (-fabi-version=6).
Those symbols still don't demangle, but given that it was a mangling bug in gcc, I am wondering if we should just close this bug -- I assume nobody will be trying to patch the demangler to deal with invalid symbols.
Re-reading this, I think it's fine to close it. The demangler is canonically maintained in gcc anyhow.