2010-04-20 52 views
6

Linux内核如何才能使用GCC进行编译?对于某些项目来说,哪些GNU C扩展真的是必要的,为什么?有哪些GNU C扩展可用,这些扩展在C99中实现并不重要?

+0

如果你捅了你,你可以找到一个问题,链接到已成功构建Linux的其他编译器。至少对于某些内核版本,'tcc'可以做到这一点。 – dmckee 2010-04-20 20:54:25

+1

标题和问题不一致。 – 2010-04-20 20:58:56

+0

dmckee:Linux内核需要修补一下才能使用tcc编译。 – Yktula 2010-04-20 21:18:23

回答

1

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

0

我想这不是他们真的那必要的。只是有很多有用的东西,交叉编译器的可移植性对Linux内核来说并不是什么大问题。更不用说为了摆脱依赖扩展而需要的大量工作。

2

Linux内核被编写成由GCC编译,因此标准兼容对于内核开发人员来说从来不是一个目标。

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

7

这里有一对夫妇的gcc扩展了Linux内核使用:

  • 联汇编
  • GCC内建命令,如__builtin_expect,__ builtin_constant,__ builtin_return_address
  • 功能属性来指定例如(例如__attribute __((regparm(0)),__ attribute __((packed,aligned(PAGE_SIZE))))))
  • 取决于gcc预定义宏的特定代码(例如某些版本中某些gcc错误的解决方法)
  • 范围在开关的情况下(情况8 ... 15 :)

这里有几个:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

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

并非Linux 依赖于gcc的这些功能,例如, NetBSD内核很少依赖gcc特定的东西。