gcc汇编程序预处理程序与标准标头不兼容

时间:2015-03-08 08:05:10

标签: gcc assembly c-preprocessor

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的一个错误吗?
或者我在这里做错了什么?

注意:
我在测试中看到gcc确实定义了__ASSEMBLER__但是大多数头文件测试__ASSEMBLY__(我确实看到一对测试__ASSEMBLER__)。适当的ifdef在某些时候发生了变化吗?

我使用的是Ubuntu 14.04,gcc报告版本:gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2

1 个答案:

答案 0 :(得分:10)

__ASSEMBLY__是一个Linux内核项目在他们知道gcc预定义宏__ASSEMBLER__的存在之前就已经完成的约定。

linux内核在linux/Makefile中明确传递__ASSEMBLY__

KBUILD_AFLAGS   := -D__ASSEMBLY__

2005年,LKML上发布了一些补丁,要求迁移到__ASSEMBLER__但未合并:Re: [RFC][MEGAPATCH] Change ASSEMBLY to ASSEMBLER (defined by GCC from 2.95 to current CVS)