Tool für Entfernen nicht benötigter Funktionen in C++-Quellcode
-
Moin moin,
ich habe eine recht umfangreiche Bibliothek und möchte allen Code entfernen, der von einem konkreten Programm nicht benötigt wird, quasi ein -fwhole-program auf Quelltextbasis. Gibt es dafür Tools?
Es kann meinetwegen auch auf primitiver Basis funktionieren (etwa indem solange Funktionsdefinitionen hinausgeworfen werden bis es nicht mehr kompiliert).
Wäre wohl kein allzu großer Aufwand, das selbst zu schreiben, aber möglicherweise gibt es das schon fertig.
-
Stichworte nach denen du Googlen kannst:
Dead Code Elimination
Dead Code Identification
Code Coveragegibt ein paar Tools aber nichts was Perfekt ist. Wenn du etwas suchst findest du aber sicher eine aktzeptable Lösung.
Wenn du GCC verwendest ist gcov mit lcov uU eine gute Lösung.
-
Baue eine statische Bibliothek, der Linker sollte nur benutzte Funktionen uebernehmen, wenn du ein Programm damit verlinkst.
-
Okay, danke erstmal.
Shade Of Mine schrieb:
Wenn du GCC verwendest ist gcov mit lcov uU eine gute Lösung.
Das hatte ich vorhin schon einmal versucht. Hier klappt es, aber unter Mac OS X 10.5 mit GCC 4.0 wurden mir die versprochenen Dateien (.gcda und .gcno) nicht angelegt.
knivil schrieb:
Baue eine statische Bibliothek, der Linker sollte nur benutzte Funktionen uebernehmen, wenn du ein Programm damit verlinkst.
Es sollte schon Quelltextbasis passieren, da die für das Programm relevanten Quelltextteile veröffentlich werden sollen.
Mithilfe von nm und den GCC-Flags -ffunction-sections -fdata-sections -Wl,--gc-sections kann man sich aber immerhin eine Liste von referenzierten Funktionen anzeigen lassen.
Falls das auch auf dem Mac klappt, wäre das schon mal nicht schlecht. Werde ich morgen mal ausprobieren.
-
Gut, beim Mac kennt der Linker zwar kein --gc-sections, dafür aber -dead_strip.
Das "funktioniert" zwar, aber optimal ist es nicht, da die Anzahl der importierten Symbole doch ziemlich groß ist und manuelles Aufräumen des Codes eine Weile dauern würde.
Alle möglichen von der Standardbibliothek und boost eingebrachten Template-Instanziierungen helfen da der Übersichtlichkeit auch nicht unbedingt (kennt ihr schon die Funktion__gnu_cxx::__normal_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > std::__copy_backward_normal<true, true>::copy_b_n<__gnu_cxx::__normal_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >(__gnu_cxx::__normal_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >, __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*, std::vector<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >)
?).