verhindert, dass gcc eine nicht verwendete Variable entfernt

9

In unseren Quelldateien haben wir normalerweise einen Versions-String wie diesen:

%Vor%

Wenn diese Zeichenfolge nicht optimiert ist, ist sie in bestimmten Fällen sehr nützlich, da Sie die Version jeder Quelldatei, die mit einer ausführbaren Datei verknüpft ist, ermitteln können, indem Sie einfach strings a.out | grep VERSION aufrufen.

Leider ist durch gcc (mit '-O') wegoptimiert. Also meine Frage ist, gibt es einen einfachen Weg (ein Compiler-Schalter wäre großartig), um gcc diese Variable zu behalten (der Name ist immer der gleiche), ohne andere Optimierungen auszuschalten.

Bearbeiten

Was meiner Meinung nach die Frage von

Ingo Leonhardt 09.04.2015, 17:32
quelle

5 Antworten

18

Sie können __attribute__((used)) gcc (funktioniert auch in clang) für die folgenden Attribute verwenden (ich sehe, dass die Frage mit gcc markiert ist):

  

Dieses an eine Funktion angehängte Attribut bedeutet, dass Code für die Funktion ausgegeben werden muss, auch wenn die Funktion nicht referenziert wird. Dies ist beispielsweise nützlich, wenn auf die Funktion nur in Inline-Assembly verwiesen wird.

Von Ссылка

Demo:

%Vor%

Sie können einige #if s und #define s verwenden, um diesen Terser zu erstellen und auch Compiler zu kompilieren, die diese Erweiterung nicht unterstützen.

    
Dogbert 09.04.2015, 17:44
quelle
4

Wie ich Ihre Frage verstehe, müssen Sie jeder Objektdatei eine Versionszeichenfolge hinzufügen, ohne Quellen zu berühren. Es kann mit dem nächsten Weg gemacht werden.

Erstellen Sie eine Header-Datei, zum Beispiel include/version.h :

%Vor%

Dann fügen Sie in Ihrem Makefile (oder was auch immer Ihr Build-System ist) das nächste gcc flag hinzu:

%Vor%

Natürlich sollte es an gcc übergeben werden, z.B. so:

%Vor%

Jetzt können Sie beobachten, dass Ihre _ver -Zeichenfolge für jede Objektdatei kompiliert wurde:

%Vor%

Was dir so etwas zeigen wird:

%Vor%     
Sam Protsenko 09.04.2015 18:08
quelle
3

Die Angabe der Variablen als volatile kann ebenfalls hilfreich sein. Deshalb wird es an erster Stelle verwendet, um Optimierungen durch den Compiler in Bezug auf diese Variable zu verhindern.

    
nikaltipar 09.04.2015 17:55
quelle
1

Da es scheint, dass alle Lösungen eine Art Dekoration der Versionszeichenfolge in der Quelle erfordern, kann es hilfreich sein, ein Makro zu definieren, das die notwendige Syntax enthält, und dieses Makro dann in den Quell- oder Headerdateien zu verwenden, wann immer dies nötig ist:

%Vor%

Dann in Ihrer Quelle einfach

%Vor%

Das Makro kann sich in einer zentralen Projektheaderdatei oder in der Befehlszeile des Compilers befinden.

Auf diese Weise müssen Sie nicht alle Quelldateien erneut anfassen, wenn Sie etwas an der Definition ändern wollen.

Beachten Sie, wie die Makrodefinition String-Verkettung verwendet, um die endgültige Versionsstring zu erstellen. Außerdem enthält es das abschließende Semikolon, sodass Sie alles entfernen können, indem Sie bei Bedarf ein leeres Makro definieren.

    
Ber 09.11.2017 09:32
quelle
0

Sie haben Bedenken, dass gcc eine nicht verwendete static char[] Variable entfernt. AFAIK, der Compiler ist richtig, dies zu tun.

Andere Antworten gaben einen Vorschlag, um das zu verbessern. Aber Sie möchten nicht den Quellcode Tausender Dateien ändern.

Dann könnten Sie vielleicht Ihren Build ändern (z. B. einige Makefile ), so dass jede solche Quelldatei, die Ihren Trick verwendet (was etwas falsch ist, wie hier besprochen ...), nicht geändert werden muss. Sie könnten also GCC gezielt aufrufen . Du willst

%Vor%

(dies ist eine Deklaration, keine Definition), die vor allem anderen kompiliert werden soll. Setzen Sie die Zeile oben in eine _declare_ver.h -Datei und kompilieren Sie mit gcc -include _declare_ver.h (stattdessen) von gcc ). Bei Verwendung von make addiere

%Vor%

in Ihrem Makefile .

Übrigens, das ist ein schmutziger Trick. Sie sollten überlegen, etwas besser zu machen (anderen Antworten folgen).

    
Basile Starynkevitch 09.11.2017 09:49
quelle

Tags und Links