【问题标题】:rpm provides shared object that is also required by a provided executablerpm 提供了所提供的可执行文件也需要的共享对象
【发布时间】:2016-10-05 19:39:39
【问题描述】:

前言:自动依赖 (AutoReqProv) 已开启

正如标题所说,我们有一个由我们构建的 RPM 包提供的共享对象,所以它被放置在规范文件的 %files 部分。但是,我们在 %files 部分也有可执行文件,它们依赖于这个 .so。因此,在启用自动依赖的情况下,它会在安装此软件包期间尝试解决此问题。显然,此 .so 尚未安装在目标系统上,因为它是正在安装的软件包的一部分。因此,它会引发安装错误。

以前有人遇到过这个问题吗?启用自动依赖项是对此的要求,因此删除它是最后的努力。

**编辑:这是我的规范文件的 %files 部分。有问题的 .so 位于 /usr/local/%{name}

%files
%defattr(-,root,root)
/usr/local/%{name}
/usr/bin/*
/etc/ld.so.conf.d/*
/etc/opt/aubit4gl2
/usr/lib/*
%attr(0755, -, -) /usr/local/bin/c4glpg
%attr(0755, -, -) /usr/local/bin/c4glpg2

错误是这样的:

error: Failed dependencies:
libaubit4gl.so is needed by aubit4gl2-10.0.4-2.i686

编辑 2:这里是 rpmbuild 命令输出的安装部分

make[1]: Leaving directory `/home/bhand/rpmbuild/BUILD/aubit4gl2-10.0.4/aubit4gl2'
+ cp -a aubit4gl2/atomix4pg/sqldist /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/local/aubit4gl2/atomix4pg
+ cp -a aubit4gl2/etc/aubitrc /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/etc/opt/aubit4gl2
+ sed -i 's/^AUBITETC=.*/AUBITETC=\/etc\/opt\/aubit4gl2/g' /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/etc/opt/aubit4gl2/aubitrc
+ sed -i 's/^AUBITDIR=.*/AUBITDIR=\/usr\/local\/aubit4gl2/g' /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/etc/opt/aubit4gl2/aubitrc
+ sed -i 's/^AUBITDIR_SRC=.*/AUBITDIR_SRC=\/usr\/local\/aubit4gl2/g' /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/etc/opt/aubit4gl2/aubitrc
+ echo '# NOBLE: Make aubit utils only create 32-bit output'
+ echo CFLAGS=-m32
+ ln -s /usr/local/aubit4gl2/lib/libaubit4gl.so /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/lib/libaubit4gl.so
+ ln -s /usr/local/aubit4gl2/atomix4pg/bin/c4glpg /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/local/bin/c4glpg
+ ln -s /usr/local/aubit4gl2/atomix4pg/bin/c4glpg2 /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/local/bin/c4glpg2
+ ln -s /usr/local/aubit4gl2/bin/amake /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/bin/amake
+ ln -s /usr/local/aubit4gl2/bin/aubit /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/bin/aubit
+ ln -s /usr/local/aubit4gl2/bin/aubit-config /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/bin/aubit-config
Processing files: aubit4gl2-10.0.4-2.i686
warning: Explicit %attr() mode not applicaple to symlink: /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/local/bin/c4glpg
warning: Explicit %attr() mode not applicaple to symlink: /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386/usr/local/bin/c4glpg2
Provides: libA4GL_HTML.so libA4GL_file.so libA4GL_memcache.so libA4GL_pcre.so libA4GL_pick.so libA4GL_roman.so libA4GL_string.so libDATA_module.so libDATA_module_definition.so libDATA_report.so libDATA_struct_form.so libEXREPORT_NOPDF.so libFORM_GENERIC.so libFORM_NOFORM.so libFORM_XDR.so libHELP_std.so libLEX_C.so libLEX_CS.so libLEX_EC.so libLEX_PERL.so libLEX_WRITE.so libLOGREPPROC_CSV.so libLOGREPPROC_HTML.so libLOGREPPROC_TXT.so libLOGREP_CSV.so libLOGREP_HTML.so libLOGREP_TXT.so libMSG_NATIVE.so libPACKER_FORMXML.so libPACKER_GZPACKED.so libPACKER_MEMPACKED.so libPACKER_PACKED.so libPACKER_PERL.so libPACKER_XDR.so libPACKER_XML.so libRPC_NORPC.so libRPC_XDR.so libSQLPARSE_INFORMIX.so libSQLPARSE_NONE.so libSQL_FILESCHEMA.so libSQL_nosql.so libSQL_unixodbc.so libUI_CONSOLE.so libUI_HL_GTK.so libUI_HL_TUI.so libUI_HL_TUIN.so libUI_TUI.so libUI_TUI_wide.so libUI_XML.so libXDRPACKER_module.so libXDRPACKER_module_definition.so libXDRPACKER_report.so libXDRPACKER_struct_form.so libaubit4gl-1.2_39.so libbarcode.so libchannel.so liberrhook_sample.so aubit4gl2 = 10.0.4-2 aubit4gl2(x86-32) = 10.0.4-2 perl(report) perl(using)
Requires(interp): /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(postun): /bin/sh
Requires: /bin/sh /usr/bin/perl libatk-1.0.so.0 libaubit4gl-1.2_39.so libaubit4gl.so libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.12) libc.so.6(GLIBC_2.2) libc.so.6(GLIBC_2.2.3) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.7) libcairo.so.2 libcurl.so.4 libdl.so.2 libdl.so.2(GLIBC_2.0) libdl.so.2(GLIBC_2.1) libfontconfig.so.1 libform.so.5 libformw.so.5 libfreetype.so.6 libgdk-x11-2.0.so.0 libgdk_pixbuf-2.0.so.0 libgio-2.0.so.0 libglib-2.0.so.0 libgobject-2.0.so.0 libgtk-x11-2.0.so.0 libm.so.6 libm.so.6(GLIBC_2.0) libncurses.so.5 libncursesw.so.5 libodbc.so.2 libpanel.so.5 libpanelw.so.5 libpango-1.0.so.0 libpangocairo-1.0.so.0 libpangoft2-1.0.so.0 libpcre.so.1 libpthread.so.0 libpthread.so.0(GLIBC_2.0) libtinfo.so.5 libz.so.1 perl(DBI) perl(Date::Calc) perl(strict) perl(using) rtld(GNU_HASH)
Processing files: libaubit4gl-1.2_39-2.i686
Provides: libaubit4gl = 1.2_39-2 libaubit4gl(x86-32) = 1.2_39-2 libaubit4gl-1.2_39.so
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.7) libcurl.so.4 libdl.so.2 libdl.so.2(GLIBC_2.0) libdl.so.2(GLIBC_2.1) libm.so.6 libm.so.6(GLIBC_2.0) libz.so.1 rtld(GNU_HASH)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386
Wrote: /home/bhand/rpmbuild/SRPMS/aubit4gl2-10.0.4-2.src.rpm
Wrote: /home/bhand/rpmbuild/RPMS/i686/aubit4gl2-10.0.4-2.i686.rpm
Wrote: /home/bhand/rpmbuild/RPMS/i686/libaubit4gl-1.2_39-2.i686.rpm
Executing(%clean): /bin/sh -e /home/bhand/rpmbuild/tmp/rpm-tmp.wtiBPg
+ umask 022
+ cd /home/bhand/rpmbuild/BUILD
+ cd aubit4gl2-10.0.4
+ rm -rf /home/bhand/rpmbuild/BUILDROOT/aubit4gl2-10.0.4-2.i386
+ exit 0
cp ~/rpmbuild/RPMS/i686/aubit4gl2-10.0.4-2.i686.rpm aubit4gl2-10.0.4-2.centos.7.postgres.i686.rpm
cp ~/rpmbuild/RPMS/i686/libaubit4gl-1.2_39-2.i686.rpm libaubit4gl-1.2_39-2.i686.rpm
cp RELEASENOTES aubit4gl2-10.0.4-2.centos.7.postgres.i686.RELEASENOTES

编辑 3:rpm -qlvp aubit4gl2-10.0.4-2.centos.7.postgres.i686.rpm 的输出

rpm -qlvp nscaubit4gl2-10.0.4-2.centos.7.postgres.i686.rpm | grep libaubit4gl
lrwxrwxrwx    1 root    root                       42 Oct 11 14:06 /usr/lib/libaubit4gl.so -> /usr/local/nscaubit4gl2/lib/libaubit4gl.so
-rwxr-xr-x    1 root    root                  2439297 Oct 11 14:06 /usr/local/nscaubit4gl2/lib/libaubit4gl-1.2_39.so
lrwxrwxrwx    1 root    root                       21 Oct 11 14:06 /usr/local/nscaubit4gl2/lib/libaubit4gl.so -> libaubit4gl-1.2_39.so

【问题讨论】:

  • 同一包中的库和二进制文件不应引发错误。一定有别的事情发生。您能否使用 %files 部分以及尝试安装该 rpm 时遇到的错误?
  • 我已根据您的要求更新了我的答案。不过,我不完全理解它应该如何。如果该 .so 由我们的 RPM 提供(即:未安装在目标系统上),并且其中一个可执行文件需要它,我预计会出现错误。还是 RPM 应该足够聪明来处理这个问题?
  • rpm 应该足够聪明。然而; /usr/local/ 默认不在 LD_LIBRARY_PATH 中;所以我认为这不是一个好主意。我建议您将 lib 安装在 /usr/lib 中。还要确保您的 .so 打包好,运行 rpm -qlp &lt;your produced rpm file&gt; 并检查您的 .so 是否在列表中。
  • 好吧,这个库从 /usr/local/%{name} 开始。它在安装过程中被放置在 /usr/lib 中。但是,在 auto deps 开启的情况下,它甚至无法进行安装,因为这种对尚未安装的库的依赖失败。我在 linux/rpm 方面的经验还不到一年,所以这只是一个初学者的理论。我可能完全错了,但这个错误对我来说很有意义。只是现在不知道如何解决它。哦对了,查询包里的库就成功了。
  • 我已经打包 rpm 三年了。我可以向你保证我从来没有遇到过打包库和可执行文件的问题!问题一定出在其他地方......当你查询你的包时,so 出现在 /usr/lib 中?

标签: linux rpm rpm-spec


【解决方案1】:

确保库中有可执行位。

【讨论】:

  • 这对我来说效果很好,因为我的库从提供列表中丢失了。我确实必须在 %install 阶段设置权限,而不是在 %files 部分使用 %attr。 RPM 版本 4.11.3
【解决方案2】:

如果包的 %files 列表中的任何文件是共享库,则该库的 SONAME 会自动添加到包提供的功能列表中。

在我的情况下,共享库的 SONAME 是空的。在为共享库设置 SONAME 后(如下在 gcc 中使用 -Wl 选项)打包修改后的共享库工作正常(自动解析功能)。

要测试 SONAME 是否设置正确,您可以使用命令objdump -p libaubit4gl.so | grep SONAME

在链接过程中,SONAME 被分配/嵌入到共享库中,如下所示

gcc -shared -fPIC -Wl,-soname,libaubit4gl.so -o libaubit4gl.so foo.o bar.o baz.o -lc

SONAME 可以不同于文件名 libaubit4gl.so。 (注意:这不是按照标准,而是建议这样做以消除您的错误。但是,如果您想按照标准命名共享库,请参阅versioning a shared library

【讨论】:

    【解决方案3】:

    您可以让您的规范文件创建两个 .rpm 文件:一个 libaubit4gl 和一个 aubit4gl。第一个提供这个库,另一个需要它。

    至少,这对我来说似乎是一种好习惯,至少如果该库可以在没有二进制文件的情况下使用的话。

    【讨论】:

    • 这就是我的想法。不过,您的措辞使我朝着正确的方向进行了良好的 Google 搜索。我目前正在查看 rpm 子包,直到 30 分钟前我才知道这是一件事。如果有效会更新。
    • 对此的更新:在安装 aubit4gl 之前从单独的包中安装库仍然给我一个依赖问题。真的不知道为什么。
    • @pid_1 在这里您可以检查 a) 库包提供的内容和 b) “主”包需要什么。
    • 他们做你所期望的,这就是为什么这整件事如此离奇。库包提供 .so,而 aubit4gl“主”包需要它。这在 rpmbuild 输出中得到确认。安装库包会将 .so 放在 /usr/lib 中,这是指向实际库的符号链接。 “主”包仍然抱怨依赖失败。
    【解决方案4】:

    我在我的规范文件中添加了“提供:libaubit4gl.so”,它现在可以工作了。出于某种原因,RPM 说 aubit4gl 包没有提供这个 .so。

    我仍然不是 100% 知道为什么会这样。但是,这就是解决我的问题的原因。

    【讨论】:

      【解决方案5】:

      我遇到了类似的问题。我正在使用 %file %attr 在创建的库上设置可执行位,但事实证明我没有在我的 %install 阶段设置可执行位。

      在 %install 和 %files 期间将共享库文件设置为 755 解决了问题。

      我猜 rpmbuild 会查看 BUILD 目录中的文件以进行分析,因此它们必须在那里正确,而不仅仅是在“rpm -i”安装之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多