If we have references to the same extern_weak in multiple objects, all of them would generate external symbols with the same name. Make them static to avoid duplicate definitions; nothing should need to refer to this symbol outside of the current object.
GCC/binutils seems to handle the same by not using a fixed string for the ".default" suffix, but instead using the name of some other defined external symbol from the same object (which is supposed to be unique among objects unless there are other duplicate definitions).
While here, I think it would be better to hoist the cast into the entry block, rename the parameter to MCSymGeneric, and have a new local variable const auto &MCSym = cast<MCSymbolCOFF>(MCSymGeneric);