【问题标题】:gcc assembler preprocessor not compatible with standard headersgcc 汇编器预处理器与标准头文件不兼容
【发布时间】: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 - &lt; /dev/null 甚至 echo &gt; empty.S; gcc -dM -E empty.S 以了解您的编译器预定义了哪些预处理器符号。
  • @BasileStarynkevitch 我已经知道该符号未定义。我进行了您的第二次测试,它证实了这一点。如果 gcc 定义 __ASSEMBLER__ 但标准标头正在检查 __ASSEMBLY__,这似乎是一个错误。
  • 你可以在gcc 命令行上自己定义它,-Wa,--defsym,__ASSEMBLY__=1

标签: gcc assembly c-preprocessor


【解决方案1】:

__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)

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2018-06-17
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多