繁体   English   中英

可执行文件在 apt 安装阶段找不到共享库

[英]Executable can't find shared library during apt install phase

这是我正在运行的命令,用于从我创建的虚拟存储库安装 Debian 包。 这个 repo 有一个包含共享库的库 A和一个库 B ,它在 Debian 的 postinst 部分启动使用这个共享库的可执行文件。 库 B 依赖于库 A(通过 Debian 的control文件)。 A库和B库都是我打包的。

apt-get -o Dir::Etc::SourceList="${VIRTUAL_REPO_PATH}/upgrade.list" -o Debug::pkgProblemResolver=yes -o Dir::Etc::SourceParts="/dev/null" -o Dir::State::Lists="${VIRTUAL_REPO_PATH}/lists" -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install ${VIRTUAL_REPO_PATH}/${COMPONENT_DEB}*.deb -y --allow-unauthenticated

我已将触发器文件添加到库 A 的 Debian 中,并带有此处提到的“ activate-noawait ldconfig ”行。

库 A 的 Debian 有 3 个文件(使用dpkg-deb --control..提取):control、postinst、triggers。

后勤

#! /bin/sh

set -e

if [ "$1" = "configure" ]; then
        ldconfig
fi

触发器

activate-noawait ldconfig

在 dpkg.log 中,我可以看到库 A 是在库 B 之前安装和配置的。

2021-04-16 08:54:16 configure libsigar:amd64 1.7.0-fs1 <none>
2021-04-16 08:54:16 status unpacked libsigar:amd64 1.7.0-fs1
2021-04-16 08:54:16 status half-configured libsigar:amd64 1.7.0-fs1
2021-04-16 08:54:16 status installed libsigar:amd64 1.7.0-fs1

库 B的 postinst 中,我正在启动可执行文件,并且在给定的时间它error while loading shared libraries: A: cannot open shared object file: No such file or directory 如果我在安装后立即启动可执行文件,一切正常。 我试图从启动可执行文件的那一刻开始注释掉 postinst 脚本并手动执行该部分 - 没有任何问题。

我还在可执行文件启动之前添加了对 postinst 的 ldconfig 调用,但没有运气。

有谁知道是什么原因?

我找到了根本原因。 看来我必须在调用 postinst 之前在 package 中创建一个符号链接(libsigar.so.0 -> libsigar.so)。 否则即使 ldconfig 也不够。

运行时库 package 应包括 ldconfig 将为共享库创建的 SONAME 的符号链接。 例如,libgdbm3 package 应该包含从 /usr/lib/libgdbm.so.3 到 libgdbm.so.3.0.0 的符号链接。 这是必需的,以便动态 linker(例如 ld.so 或 ld-linux.so.*)可以在 dpkg 安装它的时间和 ldconfig 在 postinst 脚本中运行的时间之间找到库。 [59]

http://www.chiark.greenend.org.uk/doc/debian-policy/policy.html/ch-sharedlibs.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM