So, hatte jetzt wieder Zeit mich damit nochmal zu beschäftigen und für
den Fall, dass jemand das hier findet, meine Lösung:
Sobald das Programm eine rein virtuelle Funktion verwendet (also sowas
wie: void send () = 0;) wird der Code um ~80KB größer, und es gibt
undefinierte Referenzen zu _sbrk, getpid, exit, etc. - die es auf einem
Embedded System ohne OS nicht gibt. Auch wenn man die alle als leere
Funktionen definiert hat man die 80KB Overhead. Die Verwendung eines OS
dürfte es noch schlimmer machen, und vielleicht braucht man sonst auch
gar keins.
Der Grund für das ganze ist folgendes: Rein virtuelle Funktionen zeigen
per default auf die Funktion __cxa_pure_virtual, die eine Exception
wirft, für den Fall, dass man es irgendwie (wilde casts oder so) doch
geschafft hat, die Funktion aufzurufen. Der Code zum Behandeln von
Exceptions ist dann groß und braucht _sbrk etc. Indem man
__cxa_pure_virtual als Dummy-Funktion mit Endlosschleife definiert,
vermeidet man den ganzen Exception-Kram, und kann immerhin mit einem
Debugger dort unterbrechen um den Absturzgrund zu finden. zB so:
1 | .weak __cxa_pure_virtual
|
2 | __cxa_pure_virtual:
|
3 | b __cxa_pure_virtual
|