Die gcc
Binärdatei steuert den Kompilierungsprozess, indem sie eine Reihe anderer Programme nacheinander aufruft, um die verschiedenen Arbeitsschritte (Kompilieren, Assemblieren, Verknüpfen) tatsächlich auszuführen.
Wenn Sie sagen:
gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...
Sie es fordern von der Quelle durch den C-Präprozessor laufen, und dann das Ergebnis durch den Monteur ausgeführt werden.
Der Präprozessor Schritt C schaltet:
.ifdef MACRO_FROM_CMDLINE
in:
.ifdef 1
bevor es dem Assembler, vorbei, die dann nicht Sinn davon machen kann. Aus diesem Grund erhalten Sie den Fehler "ungültiger Bezeichner". Es erklärt auch, warum die Verwendung von C-Preprozessor #ifdef
das Problem behebt.
--defsym
nicht funktioniert, weil es den Monteur eine Option, nicht das gcc
Treiberprogramm. (Der gcc
Fahrer versteht und durch einige Optionen einige der Programme aufruft, aber nicht alle.)
Sie können jedoch passieren beliebige Optionen bis zum Assembler mit dem
Syntax, die den gcc
Treiber anweist, diese Optionen an den Assembler zu übergeben (als eine Liste von durch Leerzeichen getrennten Optionen).
Zum Beispiel:
gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...
fügt
--defsym MACRO_FROM_CMDLINE=1
in die Liste der Optionen zu übergeben, wenn as
gcc
sie aufruft, und das ist, wie Sie Ihre ursprüngliche .ifdef
Beispiel Arbeit zu machen.
Sie können die einzelnen Programme von gcc
aufgerufen sehen, und die Optionen, es tatsächlich zu ihnen geht, durch Hinzufügen der -v
Option.
In diesem Fall sollten Sie etwas namens cc1
(die tatsächliche GCC C Compiler binär) aufgerufen mit dem -E
Flag (Vorprozess nur) zur Vorverarbeitung der Eingabe in eine temporäre Datei, und dann as
aufgerufen auf die temporäre Datei sehen zu montieren es.
Ich bestätige, dass die -Wa, die oben von Mat beschriebenen Optionen recht gut funktionieren. – Raj