【发布时间】:2015-03-08 08:05:10
【问题描述】:
gcc 状态手册页
file.s
Assembler code.
file.S
file.sx
Assembler code that must be preprocessed.
许多标准包含文件都有
#ifndef __ASSEMBLY__
...
#endif
允许从程序集文件中包含的包装器。我可以发誓我以前用 gcc 编写过程序,它在组装时定义了这个,但现在我遇到了问题。
这是一些测试代码:
测试.S
#include <sys/syscall.h>
#include <asm/signal.h>
.intel_syntax noprefix
.text
.global foo // int foo(int pid)
foo:
mov esi,SIGUSR1
mov eax,SYS_kill
syscall
ret
当我运行 gcc -c test.S 时,它会抱怨 asm/signal.h 中的各种内容,因为它没有看到 __ASSEMBLY__ 已定义。
现在我的工作是:
#ifndef __ASSEMBLY__
#define __ASSEMBLY__
#endif
但是,将其添加到我的所有文件中似乎是错误的。
这是 GCC 中的错误吗?
还是我在这里做错了什么?
注意:
我在测试中看到 gcc 确实定义了__ASSEMBLER__,但大多数头文件都测试了__ASSEMBLY__(我确实看到了一对测试__ASSEMBLER__)。适当的 ifdef 是否在某个时候发生了变化?
我使用的是 Ubuntu 14.04,gcc 报告版本:gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
【问题讨论】:
-
运行
gcc -dM -E - < /dev/null甚至echo > empty.S; gcc -dM -E empty.S以了解您的编译器预定义了哪些预处理器符号。 -
@BasileStarynkevitch 我已经知道该符号未定义。我进行了您的第二次测试,它证实了这一点。如果 gcc 定义
__ASSEMBLER__但标准标头正在检查__ASSEMBLY__,这似乎是一个错误。 -
你可以在
gcc命令行上自己定义它,-Wa,--defsym,__ASSEMBLY__=1
标签: gcc assembly c-preprocessor