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

时间:2012-10-07 11:13:24

标签: gcc assembly gas

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

我在程序集文件中有一段代码,必须有条件地包含/组装。

.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”错误。

2 个答案:

答案 0 :(得分:12)

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 ...

增加

--defsym MACRO_FROM_CMDLINE=1

as调用时传递给gcc的选项列表,以及如何使原始.ifdef示例正常工作。


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

在这种情况下,你应该看到一个名为cc1(实际的GCC C编译器二进制文件)的东西,用-E标志(仅预处理)调用来预处理输入到临时文件,然后{在临时文件上调用{1}}来组装它。

答案 1 :(得分:1)

奇怪,但事实证明我需要在汇编文件中使用C语法。

#ifdef MACRO
  Assembly Instruction
  Assembly Instruction
#endif

宏必须使用-D选项传递。