mikrocontroller.net

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


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Jonischkies (frajo)
Datum:

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

http://www.avrfreaks.net/wiki/index.php/Documentat...

unter 'Linker Settings'.

Autor: Mork (Gast)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht 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/Documentat...

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.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.