gcc
Als Compiler / Linker wird seine -s
Option beim Verknüpfen ausgeführt . Es ist auch nicht konfigurierbar - es enthält eine Reihe von Informationen, die entfernt werden, nicht mehr und nicht weniger.
strip
ist etwas, das auf einer Objektdatei ausgeführt werden kann, die bereits kompiliert ist. Es gibt auch eine Vielzahl von Befehlszeilenoptionen, mit denen Sie konfigurieren können, welche Informationen entfernt werden. Entfernt beispielsweise -g
nur die Debug-Informationen, die gcc -g
hinzugefügt werden.
Beachten Sie, dass dies strip
kein Bash-Befehl ist, obwohl Sie ihn möglicherweise über eine Bash-Shell ausführen. Es ist ein Befehl, der völlig unabhängig von bash ist und Teil der GNU-Suite für binäre Dienstprogramme ist.
strip
ist ähnlich dem vongcc -s
, aber ich bin kein Experte. Warten Sie auf eine weitere Antwort, wenn Sie es wirklich wissen müssen. Persönlich würde ich es jedoch vermeiden, mit irgendetwas herumzuspielen, das Sie in dieser Abteilung nicht vollständig verstehen. Ich bin mir ziemlich sicher, dass Sie eine geringere Größe der ausführbaren Datei erwarten sollten, aber keine signifikanten Änderungen der Ausführungsgeschwindigkeit.Die akzeptierte Antwort ist sehr gut, aber nur als Ergänzung zu Ihren weiteren Fragen (und auch als Referenz für alle, die hier landen).
Beide machen dasselbe und entfernen die Symboltabelle vollständig. Wie @JimLewis hervorhob, ermöglicht der Streifen jedoch eine feinere Kontrolle. Beispielsweise werden in einem verschiebbaren Objekt
strip --strip-unneeded
die globalen Symbole nicht entfernt. Jedochstrip
oderstrip --strip-all
würde die vollständige Symboltabelle entfernen.Die Symboltabelle ist ein nicht zuweisbarer Abschnitt der Binärdatei. Dies bedeutet, dass es nie in den RAM-Speicher geladen wird. Es speichert Informationen, die zum Debuggen von Zwecken nützlich sein können, z. B. um einen Stacktrace auszudrucken, wenn ein Absturz auftritt. Ein Fall, in dem es sinnvoll sein könnte, die Symboltabelle zu entfernen, ist ein Szenario, in dem die Speicherkapazität stark eingeschränkt ist (in dieser Hinsicht
gcc -Os -s
odermake CXXFLAGS="-Os -s" ...
nützlich, da dies zu einer kleineren, langsameren Binärdatei führt, die ebenfalls entfernt wird, um die Größe weiter zu verringern). . Ich glaube nicht, dass das Entfernen der Symboltabelle aus den genannten Gründen zu einem Geschwindigkeitsgewinn führen würde.Zuletzt empfehle ich diesen Link zum Entfernen von freigegebenen Objekten: http://www.technovelty.org/linux/stripping-shared-libraries.html
quelle
"gcc -s" entfernt die Verschiebungsinformationen zusammen mit der Symboltabelle, was nicht durch "strip" erfolgt. Beachten Sie, dass das Entfernen von Umzugsinformationen Auswirkungen auf die Randomisierung des Adressraumlayouts haben würde . Siehe diesen Link.
quelle
Sie machen ähnliche Dinge, aber Strip ermöglicht eine feinere Kontrolle darüber, was aus der Datei entfernt wird.
quelle