我正在看lecture note(幻灯片6):
file.o包含外部符号和已定义的符号
libc.a包含所有库功能的.o文件。
链接过程:扫描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
答案 0 :(得分:0)
但是在我的CentOS 7主机上,我什么都没看到。
寻找/usr/lib64/libc.a
。还要学习如何查找文件:研究man find
和man locate
将来可能会对您有所帮助。
也就是说,您的笔记描绘出明显不正确的图片。
首先,大多数现代编译器都集成了预处理器。 cccp
/ gcc -E
阶段通常不作为单独的阶段执行。相反,预处理器是作为常规编译的一部分运行的,其输出立即由gcc -c
阶段使用。
第二,大多数现代Unix / Linux系统使用共享库,这意味着libc.a
从未链接,而libc.so.6
则用于解析符号。 (因此,libc.a
可能甚至没有安装在您的系统上。)
实际上,您的笔记中提到了ld.so
和libc.so
,因此讲师希望使用动态链接。目前尚不清楚他/她为什么根本提到libc.a
,因为它在动态链接中没有使用。
此:
ld.so是动态链接器:将a.out转换为进程。
也是错误的:ld.so
开始运行之前,进程存在。
关于printf
静态链接到可执行文件file1
和file2
的部分,也许两者都从__vsprintf
链接到libc.so
遥远的过去,但在任何最新的Linux系统上都不正确。
可能还会有更多误导性的“事实”。 TL; DR:这些注释在太多细节上是错误的,以至于无法真正有用。