Forum: Compiler & IDEs NGW100: riesieger Code mit C++


von Mark .. (mork)


Lesenswert?

Hi,

wenn ich ein einfaches Hello-World C++-Programm mit AVR32-Studio 
kompiliere und statisch linke wird die ausführbare Datei ca 2.8MB groß. 
Kann man sie auch irgendwie kleiner kriegen?

MfG Mark

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was heißt für Dich in diesem Falle "statisch linken"? Wie soll ein 
Compiler für einen betriebssystemlosen Prozessor was anderes erzeugen 
können?

Du wirst vermutlich mit etlichen für Deine Anwendung nicht benötigten 
Libraries linken (floating point-Unterstützung, vollständiges printf 
etc.) und in Deiner "ausführbaren Datei" (was soll das auf einem 
betriebssystemlosen Controller eigentlich sein?) dürften auch noch 
etliche Debuginformationen enthalten sein.

von Mark .. (mork)


Lesenswert?

Sorry, hab vergessen zu erwähnen dass auf dem Board Linux läuft.

>Du wirst vermutlich mit etlichen für Deine Anwendung nicht benötigten
>Libraries linken

Genau das ist ja das Problem, aber wie kriegt man die nicht verwendenten 
Teile raus?

PS: Die libstdc++.so dynamisch einbinden mit insmod geht auch nicht, es 
kommt immer die Meldung "Segmentation Fault".

MfG Mark

von Εrnst B. (ernst)


Lesenswert?

schreibst du ein Programm oder ein Kernel-Modul?

Falls Kernel-Modul:
- C++ ist im Linux-Kernel eher ungewöhnlich, lern lieber C dafür.
- "Statisch gelinktes" Kernel-Modul ist für mich ein monolithischer 
Kernel, der deinen Teil mit enthält. Und evtl. noch initrd, rootfs, etc. 
da sind 2MB schon in Ordnung.

Falls Programm:
- "insmod" ist dafür da um Kernel-Module (Wie z.B. Gerätetreiber) zu 
laden. Mit dem dynamischen Linken hat das nix zu tun.
- das Nachladen von der libstdc++ wird vom dynamischen Linker "ld.so" 
automatisch gemacht, da solltest du dich garnicht drum kümmern müssen, 
ausser vielleicht einmalig "ldconfig" ausführen, nachdem du die 
libsdtc++ installiert hast.

von Mork (Gast)


Lesenswert?

Ich schreibe ein Programm, kein Kernel-Modul.

>- "insmod" ist dafür da um Kernel-Module (Wie z.B. Gerätetreiber) zu
>laden. Mit dem dynamischen Linken hat das nix zu tun.

Ok, dann hab ich da wohl etwas falsch verstanden.

>- das Nachladen von der libstdc++ wird vom dynamischen Linker "ld.so"
>automatisch gemacht, da solltest du dich garnicht drum kümmern müssen,
>ausser vielleicht einmalig "ldconfig" ausführen, nachdem du die
>libsdtc++ installiert hast.

Wie genau kann man denn die libstdc++ installieren? Standartmäßig wird 
sie nämlich nicht geladen.

von Frank J. (frajo)


Lesenswert?

Im Linux vom NGW100 ist die libstdc++ nicht dabei. Siehe hier:

http://www.avrfreaks.net/wiki/index.php/Documentation:NGW/CPPHelloWorld

unter 'Linker Settings'.

von Mork (Gast)


Lesenswert?

Ja, das ist mir schon klar, aber wie kann man sie nachladen bzw selbst 
kompillieren? Platz im RAM ist ja genug.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

C++ erzeugt halt riesige Binaries, beim statischem Linken sowieso. C 
benutzen und dann gegen dietlibc oder uClibc linken, die eigentlich eh 
schon irgendwo rumflacken sollten auf dem Teil(?). Statisches Linken 
sollte ferner nicht notwendig sein.

Michael

von Karl H. (kbuchegg)


Lesenswert?

Michael G. wrote:
> C++ erzeugt halt riesige Binaries,

Was erst mal zu beweisen wäre.

Gut, wenn man die I/O streams benutzt, bläht sich alles ein
wenig auf. Aber ansonsten sind C++ Binaries auch nicht größer
als vergleichbare C-Programme mit identischer Funktionalität.
Besonders bei letzterem beissen sich die Hunde, da wird nämlich
oft Äpfel mit Birnen verglichen. Die C++ Standardsachen machen
nämlich auch Fehlerprüfung (zb in dynamischen Arrays - vulgo vector)
welche C-Programmierer oft, mit den bekannten Nebeneffekten,
unter den Tisch fallen lassen.

Aber 2.8Mb ist schon heftig. Das kriegt noch nicht mal MS hin.
Und die haben in ihren EXE jede Menge Schrott mit drinn.

von Frank J. (frajo)


Lesenswert?

Mork wrote:
> Ja, das ist mir schon klar, aber wie kann man sie nachladen bzw selbst
> kompillieren? Platz im RAM ist ja genug.

RAM ist hier nicht von Bedeutung. Hier siehst du die Speicheraufteilung 
des NGW100:
http://www.avrfreaks.net/wiki/index.php/Documentation:NGW/NGW100_Memories

Ganz unten bei 'Disk Space Layout'. In den beiden 8MByte flash 
Bausteinen ist einfach kein Platz für eine über 4 MByte große 
Bibliothek.
Mit der Entwicklungsumgebung kannst du ja versuchen die libstdc++.so.6 
zu übersetzen. Wenn du sie dann auf die SD Karte kopierst und den lib 
Suchpfad erweiterst, sollte es gehen.
Oder du baust das gesammte Image neu und bootest von SD Karte oder tftp. 
Dann bist du nicht mehr auf die 16 MByte der flash chips begrenzt.

von Mark .. (mork)


Lesenswert?

Hallo Frank,

danke für den Hinweis! Wird denn die lib automatisch geladen, wenn sie 
auf der SD-Karte im lib-Ordner ist?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.