https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63892
--- Comment #16 from Iain Sandoe <iains at gcc dot gnu.org> --- The first error that comes up is a missing std::__codecvt_utf8_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) [libstdc++ reference to itself] === And indeed, if prevent the redirect_callers for darwin (by putting in the && sem_item::target_supports_symbol_aliases_p ()), then we get: nm -P x86_64-apple-darwin12/libstdc++-v3/src/c++11/codecvt.o |c++filt |grep do_unshift std::__codecvt_utf8_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1540 0 std::__codecvt_utf8_base<char16_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1530 0 std::__codecvt_utf8_base<wchar_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1550 0 std::__codecvt_utf16_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1570 0 std::__codecvt_utf16_base<char16_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1560 0 std::__codecvt_utf16_base<wchar_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1580 0 std::__codecvt_utf8_utf16_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1500 0 std::__codecvt_utf8_utf16_base<char16_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1590 0 std::__codecvt_utf8_utf16_base<wchar_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1f0 0 std::codecvt<char32_t, char, __mbstate_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1520 0 std::codecvt<char16_t, char, __mbstate_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1510 0 when that is removed: $ nm -P codecvt.o |c++filt |grep do_unshift std::__codecvt_utf8_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf8_base<char16_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf8_base<wchar_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf16_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf16_base<char16_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf16_base<wchar_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf8_utf16_base<char32_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf8_utf16_base<char16_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::__codecvt_utf8_utf16_base<wchar_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const T 1f0 0 std::codecvt<char32_t, char, __mbstate_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 std::codecvt<char16_t, char, __mbstate_t>::do_unshift(__mbstate_t&, char*, char*, char*&) const U 0 0 === So now to figure out what's missing from the conditions used to decide on removal of the alias.