当我有自定义的 ld-<me>.so.conf 时,ldconfig 也包括默认路径中的库

Posted

技术标签:

【中文标题】当我有自定义的 ld-<me>.so.conf 时,ldconfig 也包括默认路径中的库【英文标题】:ldconfig includes libraries from default path also when i have a customized ld-<me>.so.conf 【发布时间】:2013-11-08 13:29:02 【问题描述】:

我有交叉编译的库和一个 linux 加载器。 我在 /etc 下放置了一个自定义的 ld-.so.conf ,该 conf 文件的路径包含所有交叉编译的库和加载器。

但是当我运行 ldconfig 时,

ldconfig -C /etc/ld-.so.cache -f /etc/ld-.so.conf

所有系统库及其路径都存在于缓存文件中。 我需要生成的缓存文件只包含我的交叉编译库。

ldconfig运行轨迹如下:

strace /opt/me/ldconfig -C /etc/ld-me.so.cache -f /etc/ld-me.so.conf execve("/opt/me/ldconfig", ["/opt/me/ldc"..., "-C", "/etc/ld-me.so.cache", "-f", "/etc/ld-me.so.conf"], [/* 38 vars */]) = 0

uname(sys="Linux", node="ip-172-31-32-236", ...) = 0 brk(0) = 0x10c1000 brk(0x10c2180) = 0x10c2180 arch_prctl(ARCH_SET_FS, 0x10c1860) = 0 brk(0x10e3180) = 0x10e3180 brk(0x10e4000) = 0x10e4000 打开("/usr/lib/locale/locale-archive", O_RDONLY) = 3 fstat(3, st_mode=S_IFREG|0644, st_size=99154480, ...) = 0 mmap(NULL, 99154480, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f46155a4000 关闭(3) = 0 open("/etc/ld-me.so.conf", O_RDONLY) = 3 fstat(3, st_mode=S_IFREG|0640, st_size=25, ...) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f46155a3000 读取(3,“/opt/me/lib\n”,4096)= 25 stat(“/opt/me/lib”, st_mode=S_IFDIR|0750, st_size=4096, ...) = 0 读取(3, "", 4096) = 0 close(3) = 0 munmap(0x7f46155a3000, 4096) = 0 stat("/lib", st_mode=S_IFDIR|0555, st_size=4096, ...) = 0 stat("/lib64", st_mode=S_IFDIR|0555, st_size=12288, ...) = 0 stat("/usr/lib", st_mode=S_IFDIR|0555, st_size=4096, ...) = 0 stat("/usr/lib64", st_mode=S_IFDIR|0555, st_size=12288, ...) = 0 open("/opt/me/lib", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3

谁能告诉我为什么要添加系统库?

【问题讨论】:

【参考方案1】:

因为这是 ldconfig 定义的行为:

ldconfig 创建必要的链接并缓存到最 在指定目录中找到的最近共享库 命令行,在文件 /etc/ld.so.conf 中,和受信任的 目录(/lib 和 /usr/lib)。缓存由运行时使用 链接器、ld.so 或 ld-linux.so。 ldconfig 检查标题和 它遇到的库的文件名 确定应该更新哪些版本的链接。

受信任的目录列表可能在我从其中剪切'n'粘贴的手册页写入后的某个时间用 lib64 目录进行了更新。

您可以根据您的 conf 文件创建一个目录结构,其中包含指向真实目录的符号链接或绑定挂载,然后使用 -r 目录使 ldconfig 基于系统目录的空版本构建。

【讨论】:

我的 conf 文件与系统提供的不同(名称也不同)。因为,我通过提供“conf”文件路径来新创建缓存。我不能在这里使用“-n”选项。我只在 Amazon-linux 上看到这个问题。在其他系统上,当我只在“conf”文件中设置特定路径时执行“ldconfig”。我没有看到系统文件被添加。所以想知道这种情况到底是什么时候出现的。这样我就可以朝那个方向调试了。 我怀疑它是在构建 ldconfig 以自动包含默认路径时出现的。问题系统上的手册页说什么?如果需要,您可以从 conf 文件生成命令行参数。 Ya.. ldconfig 默认包含系统库。我不得不删除那部分代码并编译 ldconfig 二进制文件以仅获取我在 conf 文件中提供的 lib 路径。

以上是关于当我有自定义的 ld-<me>.so.conf 时,ldconfig 也包括默认路径中的库的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 ArrayAdapter add 方法来添加图像和文本视图?我有自定义数组适配器类

C++ 错误:对“<func name>”的未定义引用和 ld 返回 1 个退出状态 [重复]

Linux下的库操作工具-nmarlddldconfig和ld.so

使 /etc/ld.so.conf 中的 ld 忽略目录

<style global jsx /> 似乎没有应用

为什么LD_PREALOAD在系统调用上起作用?