Ich habe ein kleines Programm als Proof-of-Concept für ein System erstellt, das auf einer Embedded-Plattform implementiert werden soll. Das Programm ist in C ++ 11 mit der Verwendung von Std geschrieben und kompiliert, um auf einem Laptop zu laufen. Das endgültige Programm, das später implementiert werden sollte, ist ein eingebettetes System. Wir haben keinen Zugriff auf den Compiler der eingebetteten Plattform.
Ich würde gerne wissen, ob es einen Weg gibt, einen statischen Speicher eines Programms (die Größe der kompilierten Binaries) in einer vernünftigen und vergleichbaren Weise zu bestimmen, wenn es auf eine eingebettete Plattform portiert werden sollte. Die Anforderung ist, dass die Größe der Binärdatei weniger als 10 KB beträgt. Unsere Binärdatei hat eine Größe von 700 KB, wenn sie mit den folgenden Flags kompiliert und entfernt wird:
%Vor%Es dauerte 4 MB, bevor wir Strip- und Optimierungsoptionen verwendet haben.
Ich bin immer noch weit weg und es ist nicht wirklich so ein großes Programm. Wie kann ich einen Vergleich mit einem gleichwertigen Programm auf einer eingebetteten Plattform rechtfertigen?
Beachten Sie, dass die Größe der Binärdatei in dem Sinne trügerisch sein kann, dass nicht initialisierte Variablen, die .bss-Abschnitte, nicht notwendigerweise physischen Platz in der Binärdatei belegen, da diese im Allgemeinen nur als vorhanden notiert werden, ohne tatsächlich Platz zu haben ihnen gegeben ... das passiert normalerweise vom OS Loader, wenn es Ihr Programm ausführt.
Ein Beispiel für die Verwendung von elfdump in einem ELF-Bild test.elf könnte So kann ich sehen, wie viel Code (die .text-Abschnitte) und meine schreibgeschützten Daten verbrauchen. Später in der Datei sehe ich dann ... So kann ich sehen, dass meine Funktion Für ein gutes Beispiel von Wie das Programm auf zwei verschiedenen Plattformen vergleichen wird Ich denke, Sie müssen nur auf beiden Plattformen kompilieren und vergleichen Sie die Ergebnisse, die Sie von Ihrem Wenn Sie keinen Zugriff auf das eingebettete System haben, können Sie versuchen, einen Cross-Compiler zu verwenden, der für Ihr eventuelles Ziel auf Ihrem Laptop konfiguriert ist. Dadurch erhalten Sie eine Binärdatei, die für die eingebettete Plattform und die Tools zum Analysieren der Datei geeignet ist (d. H. Die plattformübergreifende Version von Hoffe, das hilft. EDIT: Dies wird auch helfen, Wie die Größe eines zu bekommen C-Funktion aus einem C-Programm oder mit Inline-Assembly? objdump
( Ссылка ) oder vielleicht elfdump
oder die Elfenwerkzeugkette ( Ссылка ) wird Ihnen helfen, die Größe Ihrer verschiedenen Segmente, Daten und Text, sowie die Größe einzelner Funktionen und Globals usw. zu bestimmen. Alle Diese Programme "schauen" in Ihre kompilierte Binärdatei und extrahieren viele Informationen wie die Größe des .text-, .data-Abschnitts, listen die verschiedenen Symbole, ihre Positionen und Größen auf und können sogar den .text-Abschnitt ... elfdump -z test.elf > output.txt
sein. Dies wird alles dumpen, einschließlich der Demontage von Textabschnitten. Zum Beispiel, von einem elfdump
auf meinem System sah ich IRemovedThisName
130 Bytes braucht. Ein schnelles Skript würde Ihnen erlauben, Funktionen sortiert nach Größe und Variablen sortiert nach Größe aufzulisten. Dies könnte Sie auf Orte zur Optimierung hinweisen ... objdump
versuchen Sie Ссылка , speziell den Abschnitt 3, der zeigt Sie erfahren, wie Sie den Inhalt der Abschnittsüberschriften mit der Option -h
erhalten. obj/elfdump
auf jedem System erhalten - die Ergebnisse hängen von der System-Anweisung ab, wie gut jeder Compiler optimieren kann, allgemeine Unterschiede in der Hardwarearchitektur usw. objdump
). Dies würde Ihnen einige Ball-Park-Zahlen dafür geben, wie das Programm auf dem eventuellen eingebetteten System aussehen würde.
Es stellte sich heraus, dass die enthaltenen Bibliotheken sehr viel Platz beanspruchten (wie im Kommentar erwähnt wurde) und durch das Entfernen dieser konnte die Größe in Kombination mit den folgenden Flags auf fast nichts reduziert werden:
%Vor%Und entfernen Sie unnötigen Code mit:
%Vor%Die 4MB könnte auf 9.4kb reduziert werden, was unter unserer Grenze liegt.
Zusammengefasst benötigt std
eine enorme Menge an Speicherplatz.
Tags und Links optimization c++ embedded g++