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在临时文件上调用以组装它.
| 归档时间: |
|
| 查看次数: |
6556 次 |
| 最近记录: |