Verfahren zur Reduzierung der Größe eines Programms
Bin ich produziert, eine hex-Datei zum ausführen auf einem ARM-Prozessor, das will ich halten unter 32K. Es ist derzeit viel größer als das, und ich fragte mich, ob jemand irgendwelche Ratschläge auf was ist der beste Ansatz, um schlank nach unten?
Hier ist, was ich bisher getan habe
- Also ich habe 'Größe' auf ihn, um festzustellen, wie groß das hex-file ist.
- Dann 'Größe' wieder zu sehen, wie groß jeweils der Objekt-Dateien sind, dass der link zum erstellen der hex-Dateien. Es scheint, die Mehrheit der Größe kommt von externen Bibliotheken.
- Dann habe ich 'readelf', um zu sehen, welche Funktionen den meisten Speicher.
- Ich durchsuchte den code zu sehen, wenn ich könnte beseitigen, die Aufrufe dieser Funktionen.
Hier, wo ich nicht weiterkommen, gibt es einige Funktionen, die ich nicht direkt aufrufen (z.B. _vfprintf) und ich kann nicht finden, was es nennt, so kann ich die entfernen Sie das nennen (ich glaube, ich brauche es nicht).
Also, was sind die nächsten Schritte?
Antwort zu Antworten:
- Wie ich sehen kann, gibt es Funktionen aufgerufen, die bis zu sehr viel Speicher. Ich kann jedoch nicht finden, was ruft es.
- Ich weglassen möchten, die diese Funktionen (wenn möglich), aber ich kann nicht finden, was ist, ruft Sie! Aufgerufen werden könnte aus einer beliebigen Anzahl von library-Funktionen, die ich Schätze.
- Der linker arbeitet, wie gewünscht, ich denke, es enthält nur die relevante Bibliothek-Dateien. Wie wissen Sie, wenn nur die relevanten Funktionen sind enthalten? Kannst du ein flag setzen oder so etwas?
- Ich bin mit GCC
vielleicht kennst du das eine schon, vielleicht ist es ja der Hilfe: muppetlabs.com/~breadbox/software/tiny/teensy.html
InformationsquelleAutor Richard | 2008-10-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Allgemeine Liste:
strip
auf die ausführbare-M
bei der Verwendung von ld), oder Sie können mit objdump auf die endgültige ausführbare Datei (beachten Sie, dass dies nur funktionieren wird, auf eine unstripped ausführbar!!!) Dies ist nicht eigentlich das problem beheben, aber es wird Sie wissen lassen, die schlimmsten übeltäter.nm
zu untersuchen, die Symbole, die aufgerufen werden, von jedem der Objekt-Dateien. Dies sollte helfen, zu finden, wer den Aufruf von Funktionen, die Sie wollen nicht genannt werden.In der ursprünglichen Frage wurde ein sub-Frage einschließlich nur relevanten Funktionen.
gcc
alle Funktionen in jeder Objekt-Datei verwendet. Zu setzen, dass ein anderer Weg, wenn Sie eine Objekt-Datei mit 10 Funktionen, 10-Funktionen sind enthalten in der ausführbaren Datei selbst, wenn man 1 eigentlich heißt.Standard-Bibliotheken (zB. libc) split-Funktionen in vielen einzelnen Objekt-Dateien, die dann archiviert werden. Die ausführbare Datei ist dann mit gegen das Archiv.
Durch die Aufteilung in viele Objektdateien der linker ist in der Lage, damit Sie nur die Funktionen, die tatsächlich aufgerufen werden. (dabei wird vorausgesetzt, dass Sie statisch gelinkt)
Gibt keinen Grund, warum Sie nicht tun können den gleichen trick. Natürlich könnte man argumentieren, dass, wenn die Funktionen nicht genannt, die kann man wohl entfernen Sie Sie selbst.
Wenn Sie statisch gelinkt gegen andere Bibliotheken, die Sie ausführen können, um die oben aufgeführten tools über Sie zu machen Sie sicher, dass Sie nach ähnlichen Regeln.
Ich würde auch vorschlagen, hantieren mit -mthumb, da die Daumen-Programme sind in der Regel kleiner als arm diejenigen.
InformationsquelleAutor Andrew Edgecombe
Andere Optimierung, die könnte sparen Sie Arbeit -ffunction-sections, -Wl,--gc-sections, vorausgesetzt, Sie sind mit dem GCC Compiler. Eine gute toolchain muss dazu nicht gesagt werden, dass, obwohl.
Erklärung: GNU ld-Abschnitte links und GCC strahlt ein Abschnitt pro übersetzungseinheit, es sei denn, Sie sagen es anders. Aber in C++, die Knoten in den dependecy graph sind die Objekte und Funktionen.
InformationsquelleAutor MSalters
Nur um zu überprüfen und dokumentieren Sie für die Zukunft, aber verwenden Sie Daumen Anweisungen? Sie sind 16-bit-Versionen von den normalen Anweisungen. Manchmal müssen Sie möglicherweise 2 16-bit-Anweisungen, damit es nicht zu Sie sparen 50% code space.
Einen anständigen linker sollte nur die notwendigen Funktionen. Allerdings müssen Sie möglicherweise compiler & linke Einstellungen-Paket Funktionen für die individuelle Verknüpfung.
InformationsquelleAutor MSalters
Auf tief eingebettete Projekte, die ich immer versuche zu vermeiden, mit einer standard-library-Funktionen. Selbst einfache Funktionen wie "strtol()" blow up-die binäre Größe. Wenn möglich einfach vermeiden, solche Anrufe.
In den meisten tief eingebettete Projekte, die Sie nicht brauchen, ein vielseitiges "printf()" oder dynamische Speicher-Allokation (viele Controller haben 32 Kb oder weniger RAM).
Statt nur mit "printf()" benutze ich ein sehr einfaches custom "printf()", diese Funktion kann nur drucken, zahlen in hexadezimal-oder dezimal-format nicht mehr. Die meisten Datenstrukturen sind vorbelegt zur compile-Zeit.
InformationsquelleAutor Seika
Ok, so dass ich am Ende nur reduziert das Projekt, um es einfachste form, dann langsam hinzugefügten Dateien eins nach dem anderen, bis die Funktion, die ich entfernen wollte, erschien in der 'readelf' - Datei. Dann, wenn ich die Datei, die ich kommentierte alles aus und langsam fügen sich die Dinge wieder ein, bis die Funktion tauchte wieder auf. Also am Ende fand ich heraus, was es nannte, und entfernt all jene Anrufe...Jetzt funktioniert es wie gewünscht...süß!
Muss einen besseren Weg, es zu tun, obwohl.
InformationsquelleAutor Richard
Andrew EdgeCombe hat eine große Liste, aber wenn Sie wirklich wollen, zu kratzen, jeden letzten byte, sstrip ist ein gutes tool, das in der Liste fehlt und und rasieren kann aus ein paar kB mehr.
Zum Beispiel, bei der Ausführung auf
strip
selbst, es kann abrasieren ~2kB.Aus einem alten README (siehe die Kommentare oben diese indirekte Quell-Datei):
Beachten Sie, dass durch die Informationen, die Sie entfernt, ein sstrip würde ausführbare Datei ist Gerüchten zufolge haben Fragen mit einigen Extras. Dies ist mehr diskutiert in den Kommentaren der Quelle.
... Für einen unterhaltsamen/verrückt zu Lesen, wie man das kleinste mögliche ausführbare Datei, dieser Artikel ist Wert, gelesen zu werden.
InformationsquelleAutor Russ
Zur Beantwortung dieser speziellen Bedarf:
Wenn Sie möchten, analysieren Sie Ihre code-Basis, um zu sehen, wer, was, von wem eine bestimmte Funktion aufgerufen wird, und Dinge wie, dass, es ist ein großartiges Werkzeug, es als "Verstehen " C" zur Verfügung gestellt von SciTools.
https://scitools.com/
Ich habe es sehr oft in der Vergangenheit bei der Durchführung einer statischen code-Analyse. Es kann wirklich helfen, zu bestimmen, Bibliothek dependency tree. Es ermöglicht das einfache durchsuchen nach oben und unten der Aufruf-Baum unter anderem.
Bieten Sie eine begrenzte Zeit, Bewertung, dann müssen Sie eine Lizenz erwerben.
InformationsquelleAutor odarcy
Könnte man sich so etwas anschaut ausführbare Datei-Komprimierung.
Es würde, wenn es nur dekomprimiert, 32k zu einer Zeit.
Oder wenn der code muß ROM-fähig.
InformationsquelleAutor TraumaPony