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

时间:2019-08-03 15:30:12

标签: linker centos libc

我正在看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

1 个答案:

答案 0 :(得分:0)

  

但是在我的CentOS 7主机上,我什么都没看到。

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

也就是说,您的笔记描绘出明显不正确的图片。

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

第二,大多数现代Unix / Linux系统使用共享库,这意味着libc.a从未链接,而libc.so.6则用于解析符号。 (因此,libc.a可能甚至没有安装在您的系统上。)

实际上,您的笔记中提到了ld.solibc.so,因此讲师希望使用动态链接。目前尚不清楚他/她为什么根本提到libc.a,因为它在动态链接中没有使用。

此:

  

ld.so是动态链接器:将a.out转换为进程。

也是错误的:ld.so开始运行之前,进程存在

关于printf静态链接到可执行文件file1file2的部分,也许两者都从__vsprintf链接到libc.so遥远的过去,但在任何最新的Linux系统上都不正确。

可能还会有更多误导性的“事实”。 TL; DR:这些注释在太多细节上是错误的,以至于无法真正有用。