Wie man unbenutzte Methoden aus der finalen Binärdatei ausschließt?

8

Ich dachte, dass private -Methoden, die nicht innerhalb ihrer Klasse verwendet werden, vom Compiler / Linker entfernt werden und nicht Teil der endgültigen Binärdatei sind.

Ich habe eine Beispielklasse mit einer privaten Methode erstellt, die implementiert aber nicht verwendet wird.

%Vor%

Und in der Implementierungsdatei:

%Vor%

Nach der Kompilierung existiert der String noch in der endgültigen Binärdatei. Warum? Und wie kann ich das verhindern?

Mit freundlichen Grüßen, Charly

    
Charly 09.08.2011, 08:56
quelle

4 Antworten

7

Eine Möglichkeit besteht darin, für jede Funktion eine .o-Datei zu haben. Erstellen Sie dann ein Archiv .a aus diesen .o-Dateien. Bei der Verknüpfung mit diesem Archiv verknüpft der Linker nur die .o-Dateien, die Symbole auflösen, d. H. Die .o-Dateien mit einer Funktion, die niemand aufruft, sind nicht verknüpft.

Eine andere Möglichkeit besteht darin, die neuesten Versionen von gcc mit Link-Time-Code-Generierung .

    
Maxim Egorushkin 09.08.2011, 09:21
quelle
7

Dies geschieht normalerweise, indem die Optionen -ffunction-sections -fdata-sections an gcc übergeben werden. Sehen Sie sich diesen Link für weitere Details an.

    
ks1322 09.08.2011 09:24
quelle
3
  

Nach der Kompilierung existiert der String noch in der endgültigen Binärdatei. Warum

Andere haben Vorschläge gemacht, wie Sie diesen unbenutzten Code in Ihrer endgültigen Binärdatei loswerden können. Ich möchte eine Antwort auf die Why geben ein bisschen - hier sind zwei Punkte, warum es unmöglich sein könnte, die Funktion zu entfernen.

Wenn Sie nicht alle Objekte dieses Typs XXX mit statischer Verknüpfung deklariert haben, kann der Compiler den Typ nicht entfernen ( und daher die Methode) aus der generierten Objektdatei, da einige andere Objektdateien möglicherweise auf den Wert mit extern zugreifen. Der Linker, der alle Objektdateien gleichzeitig sehen kann, könnte dies möglicherweise lösen.

Da Sie Ihre Frage jedoch als gcc getaggt haben, kann es sein, dass Sie nicht kompilieren und / oder mit verlinken - fvisibility = versteckt . In diesem Fall kann selbst der Linker das Symbol (und damit den Code) nicht entfernen, da andere Module das Symbol zur Laufzeit auflösen können.

    
Frerich Raabe 09.08.2011 09:24
quelle
1

Das ist wahrscheinlich eine wirklich schlechte Idee, aber ich muss es trotzdem schreiben :) Sie könnten eine Template-Klasse erstellen, wenn nicht verwendete Methoden entfernt werden.

    
duedl0r 09.08.2011 09:09
quelle

Tags und Links