gnu arm汇编程序命令行宏失败,".ifdef的标识符无效"

Raj*_*Raj 7 assembly gcc gnu-assembler

我的工具链是arm-gcc的最新版本.

我在汇编文件中有一段代码,必须有条件地包含/组装.

.ifdef MACRO_FROM_CMDLINE
 Assembly instr1
 Assembly instr2
.endif
Run Code Online (Sandbox Code Playgroud)

封装代码是最近添加的.

我试过了两个:

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>   
Run Code Online (Sandbox Code Playgroud)

-D在"无效标识符无效代码"和结果"无.endif注意.如果"错误.

--defsym在结果"MACRO_FROM_CMDLINE = 1:没有这样的文件或目录","无法识别的选项--defsym"的错误.

Mat*_*ery 13

gcc二进制驱动通过调用一些其他程序在序列实际执行工作的各个阶段(编译,装配,连接)编译过程.

当你说:

gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...
Run Code Online (Sandbox Code Playgroud)

您要求它通过C预处理器运行源,然后通过汇编程序运行结果.

C预处理器步骤将转为:

.ifdef MACRO_FROM_CMDLINE
Run Code Online (Sandbox Code Playgroud)

成:

.ifdef 1
Run Code Online (Sandbox Code Playgroud)

在将它传递给汇编程序之前,然后它就无法理解它.这就是您收到"无效标识符"错误的原因.它还解释了为什么使用C预处理器可以#ifdef解决问题.


--defsym不起作用,因为它是汇编程序的选项,而不是gcc驱动程序.(gcc驱动程序确实理解并将一些选项传递给它调用的某些程序,但不是全部.)

但是,您可以使用.将任意选项传递给汇编程序

-Wa,option[,option...]
Run Code Online (Sandbox Code Playgroud)

语法,告诉gcc驱动程序将这些选项传递给汇编程序(作为空格分隔选项列表).

例如:

gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...
Run Code Online (Sandbox Code Playgroud)

增加

--defsym MACRO_FROM_CMDLINE=1
Run Code Online (Sandbox Code Playgroud)

到调用它as时传递给的选项列表gcc,这就是如何使原始.ifdef示例工作.


gcc通过添加-v选项,您可以查看由其调用的各个程序及其实际传递给它们的选项.

在这种情况下,您应该看到一些调用cc1(实际的GCC C编译器二进制文件)调用-E标志(仅预处理)来预处理输入到临时文件,然后as在临时文件上调用以组装它.