2012-10-07 16 views
7

私のツールチェーンは最近のバージョンのarm-gccです。gnuアームアセンブラのコマンドラインマクロが ".ifdefの無効な識別子"で失敗する

私は、条件付きで組み込む/組み立てる必要のあるアセンブリファイルにコードを挿入しています。

.ifdef MACRO_FROM_CMDLINE 
Assembly instr1 
Assembly instr2 
.endif 

カプセル化されたコードが最近追加されました。

私は両方を試してみました:

gcc -x assembler-with-cpp --defsym MACRO_FROM_CMDLINE=1 <along with other necessary options> 

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 <along with other necessary options> 

-D ".ifdef無効な識別子" の結果と ".ENDIF .IF無し" エラー。

--defsymは、 "MACRO_FROM_CMDLINE = 1:そのようなファイルまたはディレクトリはありません"、 "認識できないオプション--defsym"というエラーになります。

答えて

11

gccバイナリは、さまざまな作業(コンパイル、アセンブル、リンク)を実際に実行するために、多数の他のプログラムを順番に呼び出すことによって、コンパイルプロセスを駆動します。

あなたが言う:

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ... 

あなたがCプリプロセッサを介してソースを実行し、アセンブラを通じて結果を実行することを求めています。

Cプリプロセッサのステップがオンになります:

.ifdef MACRO_FROM_CMDLINE 

へ:

.ifdef 1 

それの意味を理解することはできませんアセンブラ、それを渡す前に。このため、「無効な識別子」エラーが発生します。また、Cプリプロセッサ#ifdefを使用して問題を解決する理由も説明します。


--defsymそれはアセンブラへのオプションではなく、gccドライバプログラムですので、動作しません。 (gccドライバがそれが呼び出したプログラムの一部にいくつかのオプションを理解し、を通過し、すべてではない。)

あなたを、しかし、

を使用して、アセンブラに至るまで、任意のオプションを渡すことができます
-Wa,option[,option...] 

構文は、gccドライバに、オプションをスペースで区切ったオプションのリストとしてアセンブラに渡すように指示します。例えば

gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ... 

gccがそれを呼び出したときにasに渡されるオプションのリストに

--defsym MACRO_FROM_CMDLINE=1 

を追加し、それがあなたの元.ifdef例の仕事を作る方法です。


あなたはgccによって呼び出された個々のプログラム、およびそれが実際に-vオプションを追加することで、彼らに渡すオプションを見ることができます。この場合

は、あなたがcc1(実際のGCC Cコンパイラバイナリ)と呼ばれるものが表示されるはずの一時ファイルに前処理する(前処理のみ)-Eフラグ付きで入力を呼び出し、その後、asは組み立てるために、一時ファイルに呼び出さそれ。

+0

私は上記のMatによって記述された-Waオプションがうまく機能することを確認します。 – Raj

1

奇妙ですが、アセンブリファイルでCの構文を使用する必要がありました。

#ifdef MACRO 
    Assembly Instruction 
    Assembly Instruction 
#endif 

マクロは、-Dオプションを使用して渡されなければなりませんでした。

+0

GASはafaikの両方をサポートしていますが、アセンブリファイルでgccを実行する代わりにGASを直接呼び出すのはなぜですか? – sgupta

+0

gccを使用すると(直接GNUではない)コンパイル後にリンカを呼び出す利点がありますが、直接的にはldを使用して後でリンクする追加の手順を実行する必要があります。 Sooo ...ちょうど10秒の時間の節約? – adam

+0

@ sgupta:ここではCPPを使うのが最善の選択で、 'as 'は直接*処理しません。 (しかし '#'はx86のコメント文字なので、ファイルはまだアセンブルされているかもしれません!) 'as 'を直接使うのは悪いアドバイスです。あなたのファイルに 'foo.S'という名前をつけ、' gcc' + gccオプションでビルドします。 '-m32'、' -c'です。 –

関連する問題