https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43745
--- Comment #10 from Oscar GarcĂa <oscargarcia at renesys dot es> --- This problem can be mitigated using "pointer to interfaces". Instead of: class A { public: A(); void FncEatingVTableRamA(); void FncEatingVTableRamB(); void FncEatingVTableRamC(); void FncEatingVTableRamD(); void FncEatingVTableRamE(); void FncEatingVTableRamF(); virtual void FncASingleVirtualFunctionPutAllVTableInRam(); } I use to change it to: class IVirtual { virtual void FncASingleVirtualFunctionPutAllVTableInRam(); } class ANotInRamVTable { IVirtual* pVirtual; public: A(IVirtual* pV) { pVirtual=pV }; void FncEatingVTableRamA(); void FncEatingVTableRamB(); void FncEatingVTableRamC(); void FncEatingVTableRamD(); void FncEatingVTableRamE(); void FncEatingVTableRamF(); void FncNOTVirtual() { pVirtual->FncASingleVirtualFunctionPutAllVTableInRam(); } class DerivedA:public IVirtual //Not derived actually { //REALIZE DerivedA will have VTABLE in ram because of IVirtual ANotInRamVTable aNotInRam; DerivedA():aNotInRam(this){}; void FncASingleVirtualFunctionPutAllVTableInRam(); } It will not solve the problem, and I agree this is an important obstacle to make reusable/scalable code in reduced-RAM environments but it helps sometimes.