我在看这个lecture note (幻灯片#6):
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 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 is the dynamic linker: turns an a.out into a process.
也不正确:进程存在于
ld.so
之前开始运行。关于
printf
的部分静态链接到可执行文件 file1
和 file2
, 然后都链接到 __vsprintf
来自 libc.so
在遥远的过去可能是正确的,但在任何最近的 Linux 系统上都不正确。可能还有更多误导性的“事实”。 TL;DR:这些注释在太多细节上是错误的,实际上没有用。
关于linker - 进程链接是否仍会在 libc.a 中加载 o 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339705/