GCC --gc-sections und die Suche nach Abhängigkeiten symbol
Ich versuche die Größe zu reduzieren von meiner elf executable. Ich kompiliere mit -ffunction-sections
-fdata-sections
und die Verknüpfung mit -gc-sections
ist, aber es scheint einige der Symbole, die, glaube ich, sind unbenutzt, werden auch nicht verworfen.
Gibt es irgendein Befehl in die GNU-toolchain, die ich ausführen können, um herauszufinden, welche Symbole verwendet werden und wo?
- Toolchain: GNU arm-none-eabi -
- Plattform: Cortex-M4
- Sprache: C++
Hier sind meine typischen build-flags:
Zusammenstellung: arm-none-eabi-g++.exe -Wall -O3 -mthumb -std=c++11 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant -ffunction-sections -fdata-sections
Link: arm-none-eabi-g++.exe -static -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-gc-sections -Wl,-T"LinkerScript.ld
Danke für die Hilfe.
- Dies kann relevant sein: stackoverflow.com/questions/6687630/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich nicht in der Lage zu finden, ein Befehl, zeigte das symbol Abhängigkeiten. Jedoch konnte ich die Informationen bekommen, die ich brauchte, mit der folgenden Technik:
/DISCARD/
Abschnitt der linker-Skript. Dies wird eine entsprechende Fehlermeldung ausgegeben enthüllt, welches symbol verwendet wird. Es sieht wie folgt aus:<symbol0>' referenced in section '<symbol1>' of <lib0.a file path>(<object0 file path>): defined in discarded section '<symbol0>' of <lib1.a file path>(object1 file path>)
/DISCARD/
Abschnitt, bis Sie die Wurzel des Problems.Die Wurzel des Problems war für mich, dass eine Klasse, die geerbt von einem anderen. Dieser erstellt eine virtuelle Tabelle, und der compiler kann nicht entfernen, Toten code, auf den verwiesen wird in einer virtuellen Tabelle.
Lektion gelernt: wenn Sie wollen, um die Codegröße zu verringern und immer noch mit C++, nicht die Vererbung verwenden. Die GNU toolchain verwendet, um eine
-fvtable-gc
wechseln, um dabei zu helfen, aber es war gelöscht vor einiger Zeit. Ich werde umgestalten, meinen code zu Anschrift meinem spezifischen problem./DISCARD/ : { *(.ARM.extab*) *(.ARM.exidx*) }
--verbose
oder-Wl,--verbose
um zum abrufen der default-linker-Skript, verwenden Sie es mit-T
und fügen Sie Ihre/DISCARD/
Richtlinie auf der Oberseite, sonst kann es nicht funktionieren.Können Sie versuchen, die linker-option
-Wl,--trace-symbol=<symbol_name>
. Es wird in der Ausgabe angezeigt, wo das symbol definiert ist, und in denen das symbol verwendet wird.Erstellen Sie ein linker-map-Datei mit cross-Referenz-Ausgang:
-Wl,-Map=output.map -Wl,--cref
-dead-strip
und-why-live=*name*
?