Wie kann ich GCC zwingen, nicht verwendete Funktionen zu kompilieren?

8

Ich spalte einen Teil des Codes in meinem Projekt in eine separate Bibliothek, um in einer anderen Anwendung wiederverwendet zu werden. Diese neue Bibliothek hat verschiedene Funktionen definiert , aber nicht implementiert , und sowohl mein aktuelles Projekt als auch die andere Anwendung implementieren ihre eigenen Versionen dieser Funktionen.

Ich habe diese Funktionen in meinem ursprünglichen Projekt implementiert, aber sie werden nirgendwo anders aufgerufen. Sie werden nur von dieser neuen Bibliothek aufgerufen. Als Ergebnis optimiert der Compiler sie, und ich bekomme Verbindungsfehler. Wenn ich diesen Funktionen einen Dummy-Aufruf hinzufüge, verschwinden die Verknüpfungsfehler.

Gibt es eine Möglichkeit, GCC zu sagen, diese Funktionen zu kompilieren, selbst wenn sie nicht aufgerufen werden?

Ich kompiliere mit gcc 4.2.2 mit -O2 auf SuSE linux (x86-64_linux_2.6.5_ImageSLES9SP3-3).

    
Nathan Fellman 15.11.2010, 07:37
quelle

4 Antworten

15

Sie könnten __attribute__ ((used)) ausprobieren - siehe Funktionen von Funktionen deklarieren in das GCC-Handbuch.

    
Paul R 15.11.2010, 07:56
quelle
2

Als Pragmatiker würde ich einfach sagen:

%Vor%

auf der Dateiebene einer Ihrer Quelldateien (oder sogar eine brandneue Quelldatei, etwas in der Art von forcedCompiledFunctions.c , so dass es offensichtlich ist, wofür es ist).

Da dies nicht statisch ist, kann der Compiler kein Risiko eingehen, dass Sie ihn nicht anderweitig benötigen, also sollten Sie ihn kompilieren.

    
paxdiablo 15.11.2010 07:57
quelle
2

Ihre Frage fehlt ein paar Details, aber ich werde es versuchen ...

GCC entfernt in der Regel Funktionen in sehr wenigen Fällen:

  • Wenn sie als statisch deklariert sind
  • In einigen Fällen (wie bei der Verwendung von -fno-implemetinlines), wenn sie inline deklariert sind
  • Alle anderen, die ich vermisst habe

Ich empfehle die Verwendung von 'nm', um zu sehen, welche Symbole tatsächlich in den resultierenden .o-Dateien exportiert werden, um zu überprüfen, ob dies tatsächlich der Fall ist, und dann über irgendwelche 'statischen' Stichwörter zu sehen. Nicht unbedingt in dieser Reihenfolge ...

BEARBEITEN:

Übrigens, mit den Optionen -Wall oder -Wunused GCC wird vor unbenutzten Funktionen gewarnt, die dann die wichtigsten Ziele für das Entfernen bei der Optimierung sein werden. Achte auf

Warnung: 'xxx' definiert, aber nicht verwendet

in Ihren Kompilierprotokollen.

    
thkala 15.11.2010 07:59
quelle
1

Einige möglicherweise nützliche Vorschläge hier: Ausschalten der Optimierung für eine bestimmte Funktion in gcc 4.2.2

    
jcomeau_ictx 15.11.2010 07:58
quelle

Tags und Links