7

我的工具链是最新版本的 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”错误。

4

2 回答 2

13

二进制文件通过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来预处理临时文件的输入,然后as在临时文件上调用以组装它。

于 2012-10-07T18:39:56.003 回答
1

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

#ifdef MACRO
  Assembly Instruction
  Assembly Instruction
#endif

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

于 2012-10-07T17:17:30.807 回答