【问题标题】:relationship of c compiler and c standard libraryc编译器和c标准库的关系
【发布时间】:2018-10-31 17:40:49
【问题描述】:

我最近阅读了大量关于 glibc 函数如何在 linux 中包装系统调用的文章。然而,我想知道 glibc 和 GNU C 编译器之间的关系。
例如,我想编写自己的 C 标准实现并编写一个名为“newglibc”的新库,然后我稍微改变一下。例如,我在系统调用之前和之后进行了更多检查和操作。我必须编写一个新的编译器吗?或者我可以使用相同的 GNU gcc 编译器吗?

如果编译器与库完全分离,那么理论上有人可以在 Windows 系统上使用 gcc,如果他们可以将其转换为 .exe 并提供 Windows 提供的标准 C 库吗?
谢谢

【问题讨论】:

  • 您可以使用相同的编译器。有一个开关-nostdlib 可以关闭到 glibc 的默认链接。已经有多种不同的标准库实现可用并在生产中使用
  • Glibc 不仅仅是一个“标准 C 库”。正如您所提到的,它还处理“系统调用”,这些函数不是 C 标准的一部分。此外,C 标准库的某些部分不在 glibc 中,而是在 GCC 特定库中。
  • 你的第二个问题不清楚,已经有 gcc 到 windows 的端口(不使用 glibc,因为 glibc 开发人员不希望支持 windows)
  • @M.M 你指的是cygwin吗?
  • 或MinGW。可能还有其他端口。

标签: c winapi compiler-construction glibc


【解决方案1】:

Linux 内核、GNU C 库(“glibc”)和 GNU 编译器集合(gcc)是三个独立的开发项目。它们经常一起使用,但并非必须如此。名字中带有“GNU”的那些正式是 GNU 项目的一部分。 Linux 不是。

C 标准没有区分“编译器”和“库”;这对委员会来说都是一个“实施”。 GCC 是一个独立于 glibc 的开发项目,这在很大程度上是一个历史性的意外——但也是一个有动机的项目:在过去,每个商业 Unix 变体都附带了自己的 C 库和编译器,它们可怕 , 90% 的错误是典型的。 GNU 开始为编译器(以及同样糟糕的 shell 实用程序)提供一个不那么糟糕的替代品。

在传统的商业 Unix 上替换编译器比替换 C 库要容易得多,因为 C 库不仅仅是 C 标准第 7 条中定义的函数;正如您所注意到的,它还提供了内核的最低级接口,而且通常没有很好的文档记录。 glibc 曾经至少在某种程度上支持这些 Unix,但现在它只能用于 Linux 和一个名为 Hurd 的实验性内核。相比之下,GCC 支持数十种不同的 CPU 和内核,而 Linux 支持数十种不同的 CPU。

如果您编写自己的 C 库和/或内核,则编写“后端”相对容易,以便 GCC 可以为它们生成代码作为交叉编译器,而将 GCC 移植到 在那个环境中运行。您可能还需要为汇编器和链接器编写后端,这是第四个项目(“GNU Binutils”)。将 glibc 移植到运行 Linux 的新 CPU 是一项大而简单的任务。将 glibc 移植到一个新的操作系统是困难,特别是如果那个操作系统不是 Unix-ish。 (Windows绝对不是 Unix-ish,以至于当微软想让在 Windows 下运行为 Unix 编写的程序变得更容易时,阻力最小的路径是bolt an in-house clone of the Linux kernel onto the side of the NT kernel。我不是编造这个。)

如果您编写自己的 C 编译器,则必须使其符合为其生成代码的库和内核的期望。其中很多内容都记录在您工作环境的“ABI”规范中,但不幸的是,并非全部。

如果还不清楚,请告诉我们还有什么不清楚的地方。

【讨论】:

  • 当您所做的只是用 newlibc 替换 GLIBC(正如 M.M 在 cmets 中已经指出的那样)时,通常不需要接触 GCC。
  • @EmployedRussian 如果你让你的 newlibc 看起来像 GLIBC,是的,当然。
  • 不:您不需要需要让 newlibc 看起来像 GLIBC。 GCC 几乎不对它要编译和链接的 libc 做出任何假设。
  • @EmployedRussian 那是......真的,非常不正确。我不知道你是怎么产生这种印象的。
  • 你很困惑,但无论如何。与不同的 newlibc 链接所需要的只是 -nostdinc-nostartfiles-nostdlib。提供适当的 newlibc 片段,您就完成了。不需要对 GCC 进行适当的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
  • 2017-03-09
相关资源
最近更新 更多