Was ist der Unterschied zwischen "gcc -s" und einem "strip" -Befehl?

77

Ich frage mich, was der Unterschied zwischen diesen beiden ist:

  • gcc -s: Entfernen Sie alle Symboltabellen- und Verschiebungsinformationen aus der ausführbaren Datei.

  • strip: Verwerfen Sie Symbole aus Objektdateien.

Haben sie die gleiche Bedeutung?

Welches verwenden Sie, um:

  • Größe der ausführbaren Datei reduzieren?
  • das Laufen beschleunigen?
Tim
quelle

Antworten:

66

gccAls Compiler / Linker wird seine -sOption 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.

stripist 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 -gnur die Debug-Informationen, die gcc -ghinzugefügt werden.

Beachten Sie, dass dies stripkein 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.

Cascabel
quelle
1
Vielen Dank! Was ist das Äquivalent zu gcc -s in Bezug auf Streifen mit einigen seiner Optionen?
Tim
3
Welches verwenden Sie, um die Größe der ausführbaren Datei zu reduzieren und deren Ausführung zu beschleunigen?
Tim
Ich denke, das Standardverhalten von stripist ähnlich dem von gcc -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.
Cascabel
50

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).

Was ist das Äquivalent zu gcc -s in Bezug auf Streifen mit einigen seiner Optionen?

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-unneededdie globalen Symbole nicht entfernt. Jedoch stripoder strip --strip-allwürde die vollständige Symboltabelle entfernen.

Welches verwenden Sie, um die Größe der ausführbaren Datei zu reduzieren und deren Ausführung zu beschleunigen?

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 -soder make 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

Diego Pino
quelle
3
+1 für "nicht zuweisbarer Abschnitt der Binärdatei" und "Entfernen der
Symboltabelle
"Es wird nie in den RAM-Speicher geladen". Warum also der Mensch Streifen Zustand ‚eine vereinfachte binäre , die weniger Platz im RAM einnehmen wird‘ ?
YvesgereY
@YvesgereY: Ich denke, das ist eine etwas optimistische Behauptung. Es belegt weniger Speicherplatz auf der Festplatte und im Seitencache im RAM, wenn der Datei-Readahead-Algorithmus des Kernels diese Seite anstelle einer nützlichen Seite abruft. Oder wenn es ein Teil der binären ist , die nicht in der gleichen 4k Seite als die Symboltabelle geladen erhalten muß, dann einer Seite der meist nutzlos Daten in dem Speicher gezogen bekommen. (z. B. der Teil der Symboltabelle, der für die dynamische Verknüpfung verwendet wird.) Ich bin mir nicht sicher, ob die für die dynamische Verknüpfung benötigten Symbole in Gruppen zusammengefasst sind oder ob sie mit "nutzlosen" Debug-Symbolen gemischt sind.
Peter Cordes
7

Sie machen ähnliche Dinge, aber Strip ermöglicht eine feinere Kontrolle darüber, was aus der Datei entfernt wird.

Jim Lewis
quelle