【问题标题】:What GNU C extensions are available that aren't trivial to implement in C99?哪些可用的 GNU C 扩展在 C99 中实现并不容易?
【发布时间】:2011-02-10 08:00:19
【问题描述】:

为什么Linux内核只能用GCC编译?某些项目真正需要哪些 GNU C 扩展?为什么?

【问题讨论】:

  • 如果您四处寻找,您可以找到一个问题,其中包含指向已成功构建 linux 的其他编译器的链接。 tcc 至少可以在某些内核版本上做到这一点。
  • 这篇文章解释了使用的扩展:GCC hacks in the Linux kernel。其中有些是微不足道的,有些则不是(主要是优化技巧)。
  • 标题和问题不太匹配。
  • dmckee:Linux 内核需要打一些补丁才能使用 tcc 构建。

标签: c linux gcc c99 language-extension


【解决方案1】:

这是 Linux 内核使用的几个 gcc 扩展:

  • 内联汇编
  • gcc 内置函数,例如 __builtin_expect、__builtin_constant、__builtin_return_address
  • 要指定的函数属性,例如使用什么寄存器(例如 __attribute__((regparm(0)),__attribute__((packed, aligned(PAGE_SIZE))) ))
  • 具体代码取决于 gcc 预定义宏(例如,某些版本中某些 gcc 错误的解决方法)
  • switch case 中的范围(case 8 ... 15:)

这里还有一些:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

这些 gcc 细节中的大部分都非常依赖于体系结构,或者由于 gcc 的实现方式而成为可能,并且可能没有意义由 C 标准指定。其他的只是对 C 的方便扩展。由于构建 Linux 内核是为了依赖这些扩展,因此其他编译器必须提供与 gcc 相同的扩展才能构建内核。

并不是说 Linux 必须依赖 gcc 的这些特性,例如NetBSD 内核很少依赖 gcc 特定的东西。

【讨论】:

    【解决方案2】:

    GCC 支持Nested Functions,这不是 C99 标准的一部分。也就是说,需要进行一些分析才能了解它们在 linux 内核中的实际流行程度。

    【讨论】:

      【解决方案3】:

      Linux 内核被编写为由 GCC 编译,因此标准合规性从来都不是内核开发人员的目标。

      如果 GCC 提供了一些有用的扩展,使编码更容易或编译内核更小或更快,那么使用这些扩展是一个自然的选择。

      【讨论】:

        【解决方案4】:

        我猜他们不是真的那么必要。只是有很多有用的,而且交叉编译器的可移植性对于 Linux 内核来说并不是一个放弃细节的问题。更不用说摆脱对扩展的依赖需要大量的工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-04
          • 2011-08-14
          • 1970-01-01
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多