没有 C 标准库的 C 程序。如何?

标签 c

到目前为止我见过的所有 C 语言软件都广泛使用了所谓的“C 标准库”,这是一个软件的一部分(或者实际上) C 标准本身。所以,无论版主怎么想,这都不是一本书,也不是一个商业软件。 相反,它是包含类似 malloc() 之类的实现的基本软件库。 , printf()strcpy()通常与所有系统捆绑在一起。

现在,我需要用 C 语言编写一些软件而不使用该库,因为它在该环境中既不可用也不可行。 但我仍然需要读写文件和套接字。

对类似问题或环境有任何想法或指示吗?

最佳答案

Stricto sensu,一个不使用标准库的可移植(托管)C99 程序甚至无法进行任何输入/输出,或者可能产生任何可观察到的副作用。您甚至无法在堆中分配任何数据(就像malloc 那样)。顺便说一句,任何 C99 托管实现都需要 libc;您想要一个独立的 C 库(根据定义,它是“特定于实现的”;实际上,它可以以特定于实现的方式使用特定于操作系统的服务。另请参阅 this)。

在旧版 Linux(以及 IIRC、SVR4,例如 SunOS 5)上,曾经有一些 libsys 仅与 syscalls(2) 接口(interface)。 。 AFAIK,它已被弃用,我找不到它。

一些库(例如 GTK 的 Glib,...)提供了大多数标准 C 库函数的等效功能(但它们需要一些 libc,即托管 POSIX 系统)。

请注意,您可能会考虑使用 musl-libc也许可以从中删除您不需要的功能。您还可以考虑使用一些提供标准子集的 libc,例如dietlibc 。另请参阅维基页面 C standard library .

顺便说一句,您在使用 C 语言编写任何不使用 libc 的用户态 Linux 应用程序时可能会遇到问题(例如,因为 crt0 )。

奇怪的是,我今天甚至无法命名一种不使用 C 的自由软件语言。原则上这是可能的(例如在 Linux 上编译为仅调用系统调用),但我不知道类似的东西那个。

但是请注意(至少在 Linux 上),如果您编写一个静态链接的二进制文件,而该二进制文件调用任何标准 C 函数,则该二进制文件将仅启动 libc 的一小部分(可访问的部分)来自 crt0)。

一些标准库设施(如 setjmp(3)stdarg(3) ...)通常需要 - 或者至少受益于 - 一些编译器魔法(甚至 mallocprintf免费使用最近的 GCC )。一些标准库函数无法在可移植 C 中实现。

如果使用 gcc,请不要忘记在这种情况下 gcc-ffreestand 选项。请参阅this .

引用n1570 ,一项(草案)C11 标准,几乎与 ISO 标准类似,或与 n2573 类似。 ,接近C20标准。另请参阅Modern C还有这个C reference website 。独立开源应用程序的示例包括 Linux kernel ,但是github上还有很多其他的或gitlab并在 OSDEV 上提到,也适用于 ArduinoRaspberryPi 。我建议下载他们的源代码并研究它以获取灵感。

注意:您可以认为 C99 语言有两种方言:托管 C,其中包含标准 libc 函数,例如 fprintfmalloc 等。 .. 并以 main 开头...以及不包含它们的独立 C(但包含 setjmp 等...)并且没有启动约定。

关于没有 C 标准库的 C 程序。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26591647/

相关文章:

c - 你如何在 C 中完全删除一个数组,直到你可以重新初始化它?

c - 如何在 btree 中插入结构

c - c编程中使用openssl使用文件IO进行三重DES加密解密

c - 为什么有些 C 程序在调试时可以运行,但在发布时却不行?

c - 如何在函数中传递结构体数组并在 C 中更改其参数

在C中的特定地址构造数组

c - 当我的角色是 '*' 或 '/' 时,这个循环不应该停止吗?

c - 编译器如何处理 OpenMP 指令

c - 包含在 C 语言中的通用头文件

c - 不应使用 MISRA C 2012 规则 20.5 #undef