我目前正在准备 Comptia Linux+ 考试,并且正在学习共享库章节。其中,它说/etc/ld.so.cachefile 是一个二进制文件,但在我的例子中它不是。这是一个常规文件,我可以轻松查看其内容,并且它包含库位置。
ls -l /etc/ld.so.cache
-rw-r--r--. 1 root root 154135 Feb 11 11:17 /etc/ld.so.cache
我在一些材料中看到缓存文件是二进制文件,我很好奇为什么会出现这种不匹配?该文件的类型依赖于发行版吗?我使用的是 Fedora 工作站 27
答案1
您混淆了二进制文件和可执行(二进制)文件的定义。
书中正确提到的/etc/ld.so.cache
是二进制文件(数据文件)。
正如你所看到的运行file /etc/ld.so.cache
$ file /etc/ld.so.cache
/etc/ld.so.cache: data
从man ld.so
:
解析共享对象依赖性时,动态链接器首先检查每个依赖性字符串以查看它是否包含斜杠(如果在链接时指定了包含斜杠的共享对象路径名,则可能会发生这种情况)。如果找到斜杠,则依赖项字符串将被解释为(相对或绝对)路径名,并使用该路径名加载共享对象。
如果共享库依赖项不包含斜杠,则按以下顺序搜索:
……
- 来自缓存文件 /etc/ld.so.cache,其中包含先前在增强库路径中找到的候选共享对象的编译列表。但是,如果二进制文件是使用 -z nodeflib 链接器选项链接的,则将跳过默认路径中的共享对象。安装在硬件功能目录(见下文)中的共享对象优先于其他共享对象。
从man ldconfig
/etc/ld.so.cache
包含在 /etc/ld.so.conf 中指定的目录以及 /lib 和 /usr/lib 中找到的库的有序列表的文件。
此外,/etc/ld.so.cache
在运行时会重新生成ldconfig
。看ldconfig和ld.so.cache之间的关系
仔细检查它确实是库文件列表:
$ strings /etc/ld.so.cache | head -5
ld.so-1.7.0
glibc-ld.so.cache1.1
libz.so.1
/lib/x86_64-linux-gnu/libz.so.1
libxtables.so.7
或者再次使用ldconfig -p
:
$ ldconfig -p | head -5
227 libs found in cache `/etc/ld.so.cache'
libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
libxtables.so.7 (libc6,x86-64) => /lib/libxtables.so.7
libxml2.so.2 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libxml2.so.2
libxml-security-c.so.17 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libxml-security-c.so.17
答案2
它是一个二进制文件,因为它包含使用名为 的程序写入的二进制数据结构ldconfig
。该结构(可能是哈希表)用于有效地搜索和查找共享对象的路径。在文本模式下打开文件时看到路径的原因是因为部分结构包含字符串或字符串表(路径名),而这就是文本编辑器可以识别为ASCII
代码字符串的所有内容(因此,显示它屏幕上)。