【问题标题】:What are the functions of and what is included in the C runtimeC运行时的功能和包含的内容是什么
【发布时间】:2014-05-02 11:29:04
【问题描述】:

所以我一直试图了解 C 运行时到底是什么,并且在构建自己的内核时不得不深入了解。

我的理解是,您不需要 C 运行时来构建每个 C 程序(就像内核的情况一样)。此外,运行时提供了 C 程序和内核之间的接口。以下是我的问题:

  • 那么运行时到底是做什么的呢?

  • 只是充当这个接口吗(这样如果我们自己实现它,我们就不需要运行时),还是它还有一些其他功能?

  • 编译程序时,运行时是否链接到任何文件中?

  • printfscanf 这样的常用函数是运行时或C 库的一部分吗?运行时会提供什么样的功能?

编辑:我提到了What is the C runtime library?,但它没有回答我的问题。我所问的问题在那里没有得到解决。

【问题讨论】:

  • 我不明白“C 运行时”和“C 库”之间的区别,这些术语是什么意思? libc 不是 C 程序的运行时库吗?

标签: c runtime


【解决方案1】:

我将从不同的角度来回答这个问题,即没有操作系统的裸机嵌入式系统。在这种情况下,c 运行时执行了两个重要的功能:

  1. 未初始化的静态变量的值为零(bss 部分)

  2. 显式初始化的静态变量获取其初始值

这些是 C 运行时的最小职责,尽管可能还有其他依赖于处理器的初始化函数。执行这些任务后,运行时只是分支到main 函数。我还没有检查crt1.o 是否初始化了变量,但我认为确实如此……我的 C 运行时只是一个简短的汇编程序。

【讨论】:

    【解决方案2】:

    我先回答最后一个问题来做一些定义:

    像 printf 或 scanf 这样的常用函数是运行时或 C 库的一部分吗?运行时会提供什么样的功能?

    如果您关注this definition of runtime,那么是的:它将“运行时”视为“标准库实现”(或至少是其中的已编译部分)的同义词。但这还不是全部。

    除了库之外,在常见的 C 实现中还有一个称为“启动文件”的东西,它也可以称为“运行时”(例如 GCC 的 crt1.o)。这个小对象通常不会导出任何公共函数。

    那么运行时究竟做了什么?

    除了提供标准 API(如果我们使用包含库的运行时的广义定义)之外,它还包含一个符合 OS 约定的程序的入口点(在 Linux 上称为 _start),并且该入口点

    • 使用 C 约定调用main(使用argcargv);
    • getenv设置环境;
    • 将返回码从mainexit 的参数传回操作系统;
    • 确保atexit 回调在main 返回时运行;
    • 初始化malloc的数据结构;
    • 初始化标准流stdinstdoutstderr
    • 可以加载共享库,例如 libc 和任何 -l 标志,用于在编译时给定的共享库。

    它只是充当这个接口(这样如果我们自己实现它,我们就不需要运行时),还是它还有其他一些功能?

    这真的取决于平台。运行时将完成为 C 程序提供 C 标准和编译器手册所保证的环境所需的一切。例如。在 MS-DOS 的糟糕时期,名为“DOS extenders”的运行时也会将 CPU 设置为保护模式,并进行各种 API 转换以在此模式下调用 DOS。

    编译程序时,运行时是否链接到任何文件中?

    运行时在运行时工作(duh),而不是编译时。如果你的意思是,运行时是否在运行时链接文件:它可能,例如它可能会链接到可执行文件所需的 DLL。如果你的意思是,编译器是否在运行时文件中链接:通常是的,但它可能有一个标志来禁用它或选择不同的运行时。

    【讨论】:

    • 怀疑 - 可能会链接到共享库中,例如 libc 以及在编译时给出的共享库的任何 -l 标志 - 这不是在编译时完成的吗?
    • @Cygnus: 不是dynamically linked shared libraries,这是现在的默认设置。编译器的链接器只插入名称,让程序实际加载库。
    • 运行时,或者至少是启动文件,成为二进制程序的一部分,因为它是静态链接的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2012-06-16
    相关资源
    最近更新 更多