有哪些可用的 GNU C 扩展在 C99 中实现起来并不简单?

发布于 2024-08-29 06:24:06 字数 56 浏览 11 评论 0原文

为什么Linux内核只能用GCC编译?哪些 GNU C 扩展对于某些项目来说确实是必要的,为什么?

How come the Linux kernel can compile only with GCC? What GNU C extensions are really necessary for some projects and why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

三生一梦 2024-09-05 06:24:06

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

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

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

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

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

Here's a couple gcc extensions the Linux kernel uses:

  • inline assembly
  • gcc builtins, such as __builtin_expect,__builtin_constant,__builtin_return_address
  • function attributes to specify e.g. what registers to use (e.g. __attribute__((regparm(0)),__attribute__((packed, aligned(PAGE_SIZE))) ) )
  • specific code depending on gcc predefined macros (e.g. workarounds for certain gcc bugs in certain versions)
  • ranges in switch cases (case 8 ... 15:)

Here's a few more: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

Much of these gcc specifics are very architecture dependent, or is made possible because of how gcc is implemented, and probably do not make sense to be specified by a C standard. Others are just convenient extensions to C. As the Linux kernel is built to rely on these extensions, other compilers have to provide the same extensions as gcc to be able to build the kernel.

It's not that Linux had to rely on these features of gcc, e.g. the NetBSD kernel relies very little on gcc specific stuff.

携君以终年 2024-09-05 06:24:06

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

GCC supports Nested Functions, which are not part of the C99 standard. That said, some analysis is required to see how prevalent they actually are within the linux kernel.

暗喜 2024-09-05 06:24:06

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

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

Linux kernel was written to be compiled by GCC, so standard compliance was never an objective for kernel developers.

And if GCC offers some useful extensions that make coding easier or compiled kernel smaller or faster, it was a natural choice to use these extensions.

夜还是长夜 2024-09-05 06:24:06

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

I guess it's not they are really that necessary. Just there are many useful ones and cross-compiler portability is not that much an issue for Linux kernel to forgo the niceties. Not to mention sheer amount of work it would take to get rid of relying on extensions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文