gcc 的手册页指出
file.s
Assembler code.
file.S
file.sx
Assembler code that must be preprocessed.
许多标准包含文件都有
#ifndef __ASSEMBLY__
...
#endif
包装器以允许包含在程序集文件中。我可以发誓我以前用 gcc 编写过程序,并且它在汇编时定义了这一点,但现在我遇到了问题。
这是一些测试代码:
test.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 中的错误吗?
或者我在这里做错了什么?
NOTE:
我在测试中看到 gcc 确实定义了__ASSEMBLER__
但大多数头文件测试__ASSEMBLY__
(我确实看到一些测试__ASSEMBLER__
)。适当的 ifdef 是否在某个时候发生了变化?
我使用的是 Ubuntu 14.04,gcc 报告版本:gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
__ASSEMBLY__
是 Linux 内核项目在知道 gcc 预定义宏的存在之前自己制定的约定__ASSEMBLER__
.
linux内核传承下来__ASSEMBLY__
明确地在linux/生成文件:
KBUILD_AFLAGS := -D__ASSEMBLY__
LKML 上发布了可迁移到的补丁__ASSEMBLER__
2005年,但它们没有合并:回复:[RFC][MEGAPATCH] 更改ASSEMBLY to 汇编器(由 GCC 从 2.95 到当前的 CVS 定义)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)