【问题标题】:When and how is the code for library functions added in c?何时以及如何在 c 中添加库函数的代码?
【发布时间】:2015-07-02 19:31:03
【问题描述】:

当我们在 C 中包含头文件时,实际上是添加了 printf、scanf 等函数的声明。但是函数的代码(函数声明)是如何添加到程序中的呢?

【问题讨论】:

标签: c


【解决方案1】:

这是通过链接的过程完成的。单独编译的翻译单元有一种象征性地引用从属名称的方式,因此您的代码只会说“调用名称为'printf'的函数”,链接过程的工作是在提供的一个中查找这些符号对象或库文件。

标准库通常隐式链接到您的代码,因此您可能不知道您正在将代码与预先存在的库代码链接。如果您使用自己的库,您肯定会意识到这一点。

请注意,链接没有标准,因此您通常不能用一个编译器编译一个文件,然后用不同的编译器编译另一个文件,然后将它们链接在一起。问题不仅在于就如何表示names 达成一致,还在于如何为函数调用生成代码。然而,在流行的平台上有一些“非正式的”调用约定名称修改规则,它们提供了一定程度的互操作性。

【讨论】:

  • @Quentin:为什么?他的回答对于任何编译语言(以及许多解释语言)都是非常正确的。 ABI 不仅取决于语言,还取决于架构。对于ARM,实际上有各种各样的,包括各种PCS(实际上这是链接的主要问题)。仅 C(与 C++ 一样多)为类型的大小留出空间这一事实就是多个 ABI 的指标。
  • @Olaf 哦,好吧。名称修改让我怀疑,以及 C 始终被视为 健壮的互操作语言这一事实​​。感谢您的洞察力。
  • @Quentin:C 语言没有指定 ABI,也没有命名修改规则,也没有调用约定。确实,在任何一个平台上,通常都有足够的关于流行 ABI 的文档来实现互操作,但这不是标准的一部分。如果你愿意,你可以很好地编写一个 C 实现,它的链接器知道函数返回类型,例如,可以告诉你它们是否不匹配。只是还没有人这样做。
  • @KerrekSB:不确定,但 LTO 不会天生就提供这一点吗?对于 C/C++ 以外的语言,这已经完成。例如。 Oberon 使用二进制接口格式,其中包括加载器/链接器使用的类型信息。不过,我不确定 Ada。
猜你喜欢
  • 2020-09-27
  • 2023-01-09
  • 1970-01-01
  • 2021-10-21
  • 2021-03-30
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
相关资源
最近更新 更多