进程链接是否仍会加载 libc.a 中的文件?

Does process linking still load o files in libc.a?

我正在看这个 lecture note(幻灯片 #6):

  1. file.o包含外部符号和定义符号

  2. libc.a 包含所有库函数的 .o 文件。

  3. 链接过程:扫描 libc.a 以查找由 file.o 声明的外部符号,加载适当的 .o 文件。

ar -t /usr/lib/libc.a # lists all the .o files in libc.a

但是在我的 CentOS 7 主机上我什么也看不到。

$ ar -t /usr/lib/libc.a
ar: /usr/lib/libc.a: No such file or directory

But on my CentOS 7 host I don't see anything.

寻找 /usr/lib64/libc.a。还要了解如何查找文件:研究 man findman locate 可能会对您将来有所帮助。

也就是说,您的笔记描绘了一个明显不正确的画面。

首先,大多数现代编译器都集成了预处理器。 cccp / gcc -E 阶段通常不作为单独的阶段执行。相反,预处理器是 运行 作为正常编译的一部分,它的输出会立即被 gcc -c 阶段消耗。

其次,大多数现代 Unix / Linux 系统使用共享库,这意味着 libc.a 永远不会 linked,并且 libc.so.6 用于解析符号反而。 (因此,libc.a 可能甚至没有安装在您的系统上。)

您的笔记确实提到了 ld.solibc.so,因此讲师希望使用动态 linking。不清楚他/她为什么提到 libc.a,因为它没有在动态 linking 案例中使用。

这个:

ld.so is the dynamic linker: turns an a.out into a process.

也是不正确的:进程exists before ld.so starts 运行ning.

关于 printf 静态 linked 到可执行文件 file1file2 的部分,然后从 link 到 __vsprintf libc.so 在遥远的过去可能是正确的,但在任何最近的 Linux 系统中都不正确。

后面可能还有更多误导性的 "facts"。 TL;DR:这些注释在太多细节上是错误的,实际上没有用。