【问题标题】:is `libc` and `crt1.o` statically or dynamically linked?`libc` 和 `crt1.o` 是静态链接还是动态链接?
【发布时间】:2024-04-24 12:50:02
【问题描述】:

我真的只是想了解静态和动态链接。

当我调用像unix> gcc myfile.c 这样的编译驱动程序时,crt1.olibc.a(或libc.dylib)被链接以通过ld 生成可执行文件。我想猜测crt.o 是静态链接的,而标准C 库是动态链接的。是吗?

感谢您的帮助。我想我可能需要一个关于链接的新文本:S `

【问题讨论】:

  • crt.ocrt1.o 不是库。它只是一个目标文件。它非常小。

标签: c linker static-linking dynamic-linking


【解决方案1】:

想猜测 crt.o 是静态链接的,而标准 C lib 是动态链接的。是吗?

没有。

不完全是。

crt0.o 及其家族(bundle1.odylib1.o 等)是目标文件,而不是库,它们根本没有链接。 libc.a 是一个静态库,因此当您链接它时,它将被静态链接(即它包含的目标文件将基本上复制到您的可执行文件中)。但是,静态库也不会自行链接。 libc.dylib 是一个动态链接库 - 猜猜你使用它时它是如何链接的(当然是动态链接,在这种情况下,库本身是一个链接的、正确的可执行文件)。

【讨论】:

  • 为什么说没有链接目标文件?
  • @Barmar 并不是说​​它们没有链接到您的可执行文件中——它们没有链接(它们本身)。它们是编译的结果。
  • @Barmar 我也回答过了。
  • @H2CO3 是的,我知道lib.alib.dylib 将分别静态/动态链接。我的问题是当我调用gcc 驱动程序时默认是什么。另外,我的目标文件没有链接是什么意思? crt1.o 必须以某种方式链接?
  • @ZacharyO'Keefe To 1:大多数现代系统动态链接上的 AFAIK 是默认设置。 To 2:阅读我上面2 cmets的解释。