>>>> Based on Richard's suggestion, I have a patch to localize comdat >>>> functions which seems like a very effective solution to this problem. >>>> The text size increase is limited to the extra comdat copies generated >>>> for the specialized modules (modules with unsafe options) which is >>>> usually only a few. Since -fweak does something similar for >>>> functions, I have called the new option -fweak-comdat-functions. >>>> This does not apply to virtual comdat functions as their addresses can >>>> always be leaked via the vtable. Using this flag with virtual >>>> functions generates a warning.
+fweak-comdat-functions +C++ Var(flag_weak_comdat_functions) Init(1) +Specific to comdat functions(-fno-weak-comdat-functions : Localize Comdat Functions). +With -fno-weak-comdat-functions, virtual comdat functions are still linked as +weak functions. With -fno-weak-comdat-functions, the address of the comdat +functions that are localized will be unique and this can cause unintended +behavior when addresses of comdat functions are used. Is one of those "With -fno-weak-comdat-functions" supposed to be "With -fweak-comdat-functions"? This description doesn't really say what the flag (without the "no") does, and doesn't explain what "localize" means. +@item -fno-weak-comdat-functions +@opindex fno-weak-comdat-functions +Do not use weak symbol support for comdat non-virtual functions, even if it +is provided by the linker. By default, G++ uses weak symbols if they are +available. This option is useful when comdat functions generated in certain +compilation units need to be kept local to the respective units and not exposed +globally. This does not apply to virtual comdat functions as their pointers +may be taken via virtual tables. This can cause unintended behavior if +the addresses of comdat functions are used. It's not really the "weak" that is causing the problem -- it's the "comdat". What the option really is doing is making the functions static rather than comdat. (It's all gated under flag_weak because weak symbols are the fall-back to link-once and comdat symbols.) I'd suggest phrasing this more in terms of static vs. comdat. This looks like the right way to go, though. -cary