I ran into the sram problem recently and made some observations (maybe they are obvious)
It seems to fail when the executable in the build-directory gets slighly larger than 40kb.
"Compound" objects use way more sram than coded ones, so I avoid these.
I got the hang of understanding and editing the code in axo-objects and thus started integrating/merging bits from other objects into new ones, resulting in a smaller executable.
Also, AFAIK C++ functions and classes are the only way to have code actually be re-used, so that can help too.
I hope my statements are correct, this is just what I believe to be true and it helped me.