首页 > 解决方案 > 可执行文件在 apt 安装阶段找不到共享库

问题描述

这是我正在运行的命令,用于从我创建的虚拟存储库安装 Debian 软件包。这个 repo 有一个包含共享库的库 A和一个库 B,它在 Debian 的 postinst 部分启动使用这个共享库的可执行文件。库 B 依赖于库 A(通过controlDebian 的文件)。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 调用,但没有运气。

有谁知道是什么原因?

标签: c++ubuntudebianshared-libraries

解决方案


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

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

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


推荐阅读