Ich arbeite an einem Bare-Metal Cortex-M3 in C ++ für Spaß und Profit.
In letzter Zeit habe ich beschlossen, die STL-Bibliothek zu verwenden, da ich einige Container benötigte. Ich dachte, dass durch die Bereitstellung meines Allokators würde es nicht viel Code hinzufügen Endgültige Binärdatei, da Sie nur das bekommen, was Sie verwenden. Ich habe eigentlich überhaupt keinen Linking-Prozess mit der STL erwartet (Ich gebe meinen Allokator an), da ich dachte, es sei alles Vorlagencode.
Ich kompiliere mit -no-exception übrigens.
Leider werden etwa 600 KB oder mehr zu meiner Binärdatei hinzugefügt. Ich habe nachgeschaut, welche Symbole sind in der endgültigen binär mit nm enthalten und es schien mir ein spaß. Die Liste ist so lang Ich werde es nicht versuchen und hinter mir lassen. Obwohl es einige schwache Symbole gibt.
Ich habe auch in der Map-Datei gesucht, die vom Linker erzeugt wurde, und ich habe sogar die scanf-Symbole gefunden
%Vor%Wie kann ich das debuggen? Zuerst wollte ich verstehen, was genau GCC zum Linken verwendet (ich verlinke über GCC). Ich weiß, dass wenn das Symbol in einem Textsegment gefunden wird das ganze Segment wird benutzt, aber das ist immer noch zu viel.
Irgendein Vorschlag, wie man das angehen könnte, würde wirklich geschätzt werden.
Danke, S.
Wenn Sie die GCC-Optionen -v
und -Wl,-v
verwenden, werden Ihnen die verwendeten Linker-Befehle (und Versionsinformationen des Linkers) angezeigt.
Welche Version von GCC verwenden Sie? Ich habe einige Änderungen für GCC 4.6 vorgenommen (siehe PR 44647 und PR 43863 ), um die Codegröße für eingebettete Systeme zu reduzieren. Es gibt noch eine ausstehende Verbesserungsanforderung ( PR 43852 ), um das Einfügen der IO-Symbole zu deaktivieren 's seeing - einige von ihnen stammen aus dem ausführlichen Terminhandler, der eine Nachricht ausgibt, wenn der Prozess mit einer aktiven Ausnahme beendet wird. Wenn Sie keine Ausnahmen verwenden, ist ein Teil dieses Codes für Sie nutzlos.
Das Problem betrifft nicht die STL, sondern die Standardbibliothek.
Die STL selbst ist pure (in gewisser Weise), aber die Standard-Bibliothek enthält auch all diese Streams-Pakete und es scheint, dass du es auch geschafft hast, libc
einzubinden ...
Das Problem ist, dass die Standard-Bibliothek nie dazu gedacht war, auseinander genommen zu werden, also gab es vielleicht keine großen Bedenken, Sachen aus der C-Standard-Bibliothek wiederzuverwenden ...
Sie sollten zuerst versuchen herauszufinden, welche Dateien beim Kompilieren eingezogen werden (zB strace
) ), auf diese Weise können Sie überprüfen, dass Sie nur header-only Dateien verwenden.
Dann können Sie versuchen, die auftretende Verknüpfung zu entfernen. Es gibt Optionen, die genau so an gcc übergeben werden, dass Sie einen standardbibliotheksfreien Build wünschen, etwas wie --nostdlib
zum Beispiel, aber ich bin nicht genug versiert genug, um Sie genau hier zu unterrichten.