gpt4 book ai didi

linux - rpmbuild 不包括符号链接(symbolic link)共享对象作为提供

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:18 31 4
gpt4 key购买 nike

我正在构建一个 RPM,它本质上只是打包一组供应商提供的 .so 二进制文件,以便它们可用于我们的内部应用程序,该应用程序也是通过 RPM 安装的。

其中一个库带有多个版本 - libexample_base.so 和 libexample_debug.so(以及其他)。我目前正在尝试打包这些,以便它们都包含在 RPM 中(以便开发人员可以在需要时在它们之间切换),但是通过在 %install 期间创建符号链接(symbolic link)来选择 libexample_base.so 作为默认版本,然后将其打包为RPM 中的一个文件。

%install
[... Copy the files from the tarball to the buildroot ...]
pushd %{buildroot}%{_libdir}
ln -sf libexample_base.so libexample.so
popd

这很好用……除了一个问题。它使用自动依赖项生成,虽然它提供了所有具有实际文件的共享对象,但它没有提供 libexample.so,尽管符号链接(symbolic link)在 %files 中并且安装正确。不幸的是,供应商库不提供 SONAME 条目,并且由于它们是二进制 blob,我无法轻松添加它们,因此 RPM 取决于实际文件名。所有下游 RPM 都需要 libexample.so,并且由于此 RPM 未将其列为要求,因此它们由于缺少依赖项而拒绝安装,即使确实有效(ldconfig 可以毫无问题地找到 libexample.so)。

关于如何提示 rpmbuild 将符号链接(symbolic link)解析为提供的任何想法?

最佳答案

经过一些进一步的研究,我确定我正在尝试做的事情是不可能的,以及为什么。核心问题归结为 rpmbuild 的行为,该行为旨在处理正确生成的带有 SONAME 条目的共享对象。它明确地没有列出指向以 .so 结尾的共享对象的符号链接(symbolic link),因为在正常行为下,这些符号链接(symbolic link)指向版本化共享对象 (.so.#.#),并且您的应用程序应该依赖于这些版本化对象 -符号链接(symbolic link)旨在包含在开发包中,只是为了让您的链接器找到最新的链接。

我遇到了第二种情况,当事情没有正确完成时用作备份 - 对于 RPM 和 GCC,当不存在 SONAME 时,它使用文件名。当我运行 GCC 时,文件名为 libexample.so(指向真实文件的符号链接(symbolic link)),并且它没有 SONAME,因此它只是将自身配置为链接到 libexample.so; rpmbuild 看到这一点并将其设置为应用程序 RPM 的要求。然而,由于 rpmbuild 明确地从库 rpm 中排除了那个名称,因为它看起来像一个开发链接,所以没有办法协调这两个 rpm。

解决方案?现在,我正在使用我的解决方法,只是制作文件的副本 - 当存在具有该名称的物理文件时,它就可以工作。正确的方法是修复共享对象,尽管我需要联系上游供应商来完成。

关于linux - rpmbuild 不包括符号链接(symbolic link)共享对象作为提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40306694/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com